前回の
実例を交えた使い方
Test2::V0
には、
オブジェクトのモック
外部APIに接続する処理をテストする際に、
mock
関数を使うと、
override
に渡しています。クラスメソッドを呼び出すと上書きした値が返ってきており、
特徴的なのは、before
、after
、around
のフックが登録できるようになっていることです。次のコードのようにaround
を使うことで、
例外の捕捉
異常系のテストを行う際に、
例外が発生した際のメッセージの比較、
1行目では、
2行目では、dies
関数に渡したブロック内で発生した例外を戻り値として、lives
関数を使って例外が発生しないことをテストしています。
警告の捕捉
Perlのwarn
による警告を捕捉し、
警告が出力される関数について、
foo
関数内で警告が発生したかどうかをテストしています。さらに発生した警告の内容のチェックするため、warning
関数が返す値を見ています。
なお、Test2::Plugin::NoWarnings
を使って、
ほかにもTest2::Tools::
といったネームスペース以下にTest2用のツールセットがいくつか公開されていますので、Test2::V0
が提供するものだけでは足りないと思ったときはCPAN内を検索してください。
日本語を出力する場合
テストに与える説明文として日本語を書いたときは、Wide character in print
の警告が出ることがあります。
よくある回避方法として、Test::Builder
で出力する際にファイルハンドルに対してエンコーディングを指定する方法があります。Test2::V0
ではこのような回避は不要となり、Test2::Plugin::UTF8
をあらかじめインポートしておくことで解決してくれます。
ただしTest2::V0
をインポートしていると、Test2::Plugin::UTF8
が有効になるため特に気にする必要はないのですが、
乱数のシードを設定する
Test2::V0
内で有効になるプラグインTest2::Plugin::SRand
では、srand
を呼び出すようになっています。テスト実行時には次のようにメッセージが出力され、
デフォルトでは乱数のシードは現在日時の形式になっているため、
そこで、Test::V0
がインポートされる前にTime::HiRes
のgettimeofday
を使ってマイクロ秒単位のエポック秒T2_
に値をセットしておくことでシードとして設定されるため、
Test::Moreとの非互換なコード
ここでは、Test::More
を使った既存のテストをTest2::V0
に移行してみましょう。
多くの場合、use Test::More;
している行をuseTest2::V0;
に置き換えることで移行できるはずですが、
データ構造の比較―is_deeply
Test::More
ではデータ構造の比較にはisではなくis_
が使われていましたが、Test2::V0
で提供されるのはis
のみです。ただし、
オブジェクトのクラスのチェック──isa_ok
Test2::V0
では、
モジュールのロードのテスト
モジュールの文法エラーやロードした際のランタイムエラーがないことを確認するために、Test::More
ではrequire_
やuse_
といったテスト関数が使われていました。Test2::V0
ではこれらの関数が廃止されたため、require_
の代わりにrequire
を直接呼び出すように変更する必要があります。モジュールのロードが失敗したときの例外によりテストは失敗するため、use_
も同様の理由でuse
に変更する必要があります。
<続きの
本誌最新号をチェック!
WEB+DB PRESS Vol.130
2022年8月24日発売
B5判/168ページ
定価1,628円
(本体1,480円+税10%)
ISBN978-4-297-13000-8
- 特集1
イミュータブルデータモデルで始める
実践データモデリング
業務の複雑さをシンプルに表現! - 特集2
いまはじめるFlutter
iOS/Android両対応アプリを開発してみよう - 特集3
作って学ぶWeb3
ブロックチェーン、スマートコントラクト、NFT