今日のPythonPython中心に、日々発生する疑問点や解決策を記録していきます。内容が間違っていたらゴメンね。このブログは目次を用意しています。記事をお探しの際は、ご利用ください。web2pyでのdoctestの使い方を説明しました。今回はどのように、doctestコードを書いたら良いのか解説してみたいと思います。前回の『テストの必要性』でも説明しましたが、今回のテストコードの目的は「品質向上のためのコード」でも「TDD(テスト駆動開発)のためのコード」でもありません。目的は、コンパイルチェックの代わりとなる「構文チェック」のためのテストコードです。このため最低限のコードを実行するだけのテストになります。今回説明するコードは、より複雑な目的のためのコードにも利用が可能です。web2pyコントローラのコードを実行するPythonシェルdoctestに記述するコードは、Pythonシェルで実行する。実行したコマンドとその結果をコピーして、テスト対象の関数のドキュメント文字列などに貼り付ける。いうのが作成手順である。シェルを立ち上げる必要がある。後に、アプリケーション名と実行したい関数が記述されたコントローラファイル名を付けて起動する。コントローラファイルを指定して起動している。このままだとインタラクティブ・シェル(IPython)が立ち上がる。インタラクティブ・シェルのレスポンスと通常のPythonシェルのレスポンスとでは、返ってくる内容が違う場合がある。付けて通常のシェル環境を起動させるようにする。-MP起動したPythonシェルで下のように、コントローラの関数に対するテストコードを、入力して実行できることが確認できる。index().has_key('message')True>>>この環境を使って、テストコードの作成を行っていく。アクセス制御が設定されている関数に対するdoctestアクセス制御が設定されている関数に対するテストを考えてみる。よって、関数へのアクセス時にログインを要求される。doctestではエラーになった。現在は、事前にログインしていれば(セッション期限に達しない限り)、管理画面上でのテストは正常にパスするようになっている。前回紹介したコマンドラインでのテストや、Pythonシェル上でのテストコード実行では、次のようなエラーになる。OTHER>>>この場合、次のコードを付加すると正常に動作させることが可能だ。ユーザ(a@a.com)及びパスワード(password)でログインを行う。bool関数でラップしている。先ほどの関数にコードを追加する。このコードでは、コマンドライン上のテストもパスすることが可能だ(ユーザ及びパスワードは事前に登録しておく必要はある)。いったデコレータを使用している場合も、ログインユーザが適切な権限を所持していれば、同様にコードを追加すればテストが可能となる。デコレータを使った関数に対するテストは、もう少し複雑になる。詳細はリンク先を参照してもらいたいが、一口に説明すると、認証されたリンクからのみアクセスを許可する機能だ。requires_signature()が設定されている関数に対しては、管理画面上のテストもパスすることができない。この場合、次のコードを追加すれば、テストをパスすることが可能だ。index().has_key('message')Trueこれは、URLから生成した認証用のハッシュ値をrequest変数に設定することにより、requires_signature()をパスすることが可能となる。ログインを要求するため、login_bare()も使用している。index関数定義は次のように設定できる。これ以外の属性などのチェックを利用するのもOKだ。それでは辞書型データを返さない関数に対するdcotestは、どう書いたら良いだろうか?。コントローラファイルに、次のような関数定義があったとする。columns=columns)この関数に対しては、次のテストコードが考えられる。部分はメモリのアドレス値なので、テストの度に変更されてしまう。このため次のようにコードを変更する。