2012年9月11日火曜日

rst2blogger その2

rst2bloggerでBloggerに投稿する際にpタグが消えてしまう現象ですが、rst2bloggerのソースを変更することで対応できました。

cli.py

#post_to_update.content = atom.data.Content(type='html', text=post_content)
post_to_update.content = atom.data.Content(type='text', text=post_content)

rst2blogger

原典管理どうしよう、と思いつつも、reSTで書けると聞いて導入してみます。
若干ソースコードを変更しつつ導入したので、メモ。

導入

gdata

Google+ と連携(よく分からない)している場合、アップロード時にエラーが発生するようです。 Issue 578 にあるように変更します。
圧縮ファイルをダウンロードして、src/gdata/blogger/data.py を変更。
#BLOG_ID2_PATTERN = re.compile('tag:blogger.com,1999:user-(\d+)\.blog-(\d+)')
BLOG_ID2_PATTERN = re.compile('tag:blogger.com,1999:user-(g?\d+)\.blog-(\d+)')
で、インストール。
python setup.py install

rst2blogger

pip からインストールできますが、自分的にはちょっと不都合があるので修正します。
そのままの状態でアップロードすると、見出しのレベルが h4 から始まってしまいます。 対して、Blogger のエディタから選択できる見出しレベルは h2 から。
そういうわけで、ソースコードをいじります。 対象は、rst2blogger/cli.py
#post_title, post_content = rst2post.format_post(options.filename)
post_title, post_content = rst2post.format_post(options.filename, 2)
その後、インストール。

気になるところ

rst2html.py なら p 要素で囲まれる部分が、全て br 表現になってしまう。 どうしようもないのだろうか?

2012年9月10日月曜日

PL/SQL テスティングフレームワーク

結論: PL/Unit が一番お手軽っぽいよ。utPLSQL もよさそうですよ。

種々のテスティングフレームワーク

Wikipedia の ユニットテスト・フレームワーク一覧 にあるように、PL/SQL にも色々なテスティングフレームワークがあるようだ。

今回はPL/Unitを使うことにしたが、少しだけ別のフレームワークも見てみた。

utPLSQL

最低限のテスト実装量は PL/Unit と同程度で済みそう。 また、アサーション関係の関数が型毎に分かれていないため、覚える量が少ないのも利点。

テスト対象のパッケージ中にテストを各スタイルにも対応できるように、テスト関係の プロシージャ/関数にプリフィックスを設定できるようになっている。 (まぁ、特に問題がなければ、テスト対象とテストはパッケージを分ける方が好きだけど)

他にも色々な機能が備わっているようだし、使ってみたい内容だ。

最終リリース日が2005年6月2日と古いが、PL/SQL の言語仕様がさほど変わっていないからかもしれない。 (ちなみに PL/Unit は2006年2月11日。大して変わらない)

PLUTO

大変にクセの有りそうなフレームワーク。

外見だけを乱暴に書くと、テストをパッケージではなくてTYPEオブジェクトに記述するようになっている。 まあ、それは良いとして…

テスト実装に必要なタイプ量が多い。 pluto_util_object の実体化やらそのメンバを呼び出すところやら、毎回書かないといけなさそう。

リファレンスっぽいものを見つけられていない。チュートリアルはあるんだけど… テスト実装するのが大変そうに感じてしまう。

最終リリース日は2008年7月18日。

ruby-plsql-spec

Ruby で頑張る、ややDSL感溢れるフレームワーク。

PL/SQL だけでは環境を構築できないわけですが、Ruby 好きならいいのかも? 環境構築に関しては、多分 gem さえ入っていれば何とかなったりするんじゃないでしょうか。

最終リリース日は2012年4月16日。

PL/Unit による PL/SQL コードのユニットテスト

PL/Unitというテスティングフレームワークを見つけたので使ってみた。結構お手軽にテストできたので、紹介してみる。
意外とこの PL/Unit を紹介しているページが無いのが残念だ。 しかし、手順は簡単なので、PL/SQL でプログラミングすることがある人には試してもらいたい。(品質的な意味で)

準備

PL/Unit - Test Driven Development for Oracle から ZIP ファイルをダウンロードした後、中身の install_plunit.sql を実行。
インストールのページ にもあるように、データディクショナリを参照するため、権限を持ったユーザで接続する。 結果として、plunit というパッケージが作成される。

テンプレ

最低一つのパッケージが必要。
PACKAGE には setup, teardown, t_{テスト名} を列挙。 PACKAGE BODY には t_{テスト名} の定義を列挙。
teardown には rollback; を入れるといいと思う。

PACKAGE

create or replace package TEST_HOGEHOGE is
begin
    procedure setup;
    procedure teardown;

    procedure t_order_and_cancel;
    procedure t_order_and_modify;
    procedure t_order_cant_modify_after_shipping;
end;
/
show errors

PACKAGE BODY

create or replace package body TEST_HOGEHOGE is
    -- ヘルパー関数など
begin
    procedure setup is
    begin
        update Stock set amount=10 where item_no = '...';
    end;

    procedure teardown is
    begin
        rollback;
    end;

    procedure t_order_and_cancel is
        result number;
    begin
        result := process_order(MY_ORDER_PKEY);
        plunit.assert_equals(0, result, 'order successes');

        plunit.assert_query_equals_value(
                'select amount from Stock where item_no=''hogehoge'' ',
                3,
                '3 hogehoges are still in stock');

        result := process_cancel(MY_ORDER_PKEY);
        plunit.assert_equals(0, result, 'cancel successes');
        -- :
    end;
end;
/
show errors

テストスイート起動

テストの実施に際し、PL/Unit のサイトにはApollo Proというフリーのツールを使うように書いてあるが、WinXP SP3 (32bit)の環境では動かなかった。
コマンドラインからの起動は、SQL*Plusから以下のようにすれば良い。
execute plunit.run_all_tests(owner=>'SCOTT', package_name=>'TEST_HOGEHOGE', show_output=>true);

実行すると、t_ 関数毎にテストの成否が列挙される。
で、仕上げに「The following tests failed:」ということで、失敗したテストが表示される。 実用上それほど問題にはならないが、この内容、最後に失敗したテストだけが表示されているようだ。 テスト数が多いと、失敗したテストを探すのに若干手間取るかもしれない。