nDiki : Test::More

Test::More

Perl でテストスクリプトを書くためのフレームワークTest::Harness に対応。Test::Simple パッケージに含まれている。Perl 5.6.2 以降から Perl にバンドルされるようになった。

Perl 5.004_05 以降に含まれている Test モジュールとは ok 関数の引数が異なるので、互換性がないので注意が必要である。

モジュールを読み込めるかチェックする (use_ok)

 #!/usr/bin/perl
 use strict;
 use warnings;
 use Test::More tests => 1;

 BEGIN { use_ok('MyNewModule'); }

use_ok の中で use が実行されるので、別途同じモジュールを use する必要はない。

式の値が真かどうかチェックする (ok)

 #!/usr/bin/perl
 use strict;
 use warnings;
 use Test::More tests => 1;

 ok('abc' =~ /b/);

サブルーチンの返り値が期待した値かチェックする (is)

 #!/usr/bin/perl
 use strict;
 use warnings;
 use Test::More tests => 1;

 is(substr('abcdef', 0, 2), 'ab');

isa が真がチェックする (isa_ok)

テスト対象が定義されているかどうかを確認してくれるので、自分で isa() を呼んでチェックするよりよい。

 #!/usr/bin/perl
 use strict;
 use warnings;
 use Test::More tests => 2;
 use IO::File;
 my $fh = new IO::File;
 isa_ok($fh, 'IO::File');
 isa_ok($fh, 'IO::Handle');

2005年3月13日 (日)

テスト。More。

WiKicker のテストスクリプトの作成には Perl 5.005_03 でも標準バンドルされている Test モジュールを使用している。 テストのためだけに追加のモジュールを要求するのも悪いかなと思って。

しかし Perl 5.6.2 以降にはすでに標準バンドルされている Test::More にそろそろ移行したい。

5.005_03 で WiKicker を使っている人も少ないようだし WiKicker 0.25 からは Test::More を PREREQ_PM に追加することにしよう。 Test モジュールと Test::More モジュールは互換性がないので、順次テストスクリプトを修正していく予定。

[ 3月13日全て ]

2006年9月13日 (水)

Test::WWW::MechanizeWeb アプリケーションテストファースト開発

テストファースト開発に慣れてしまうと、テストコード無しにプログラムを書くというのは不安でたまらなく感じてくる。

テストが欲しい。安らぎが欲しい。

今開発している WiKicker ベースの Web アプリケーションもだんだん機能が増えてきて、コードを触るのがコワくなってきた。

今回は Basic 認証等もあるので、WWW::Mechanize::CGI ではなくてきちんと deploy してから Test::WWW::Mechanize でテストすることにした。

Test::WWW::Mechanize、使ってみると WWW::Mechanize + Test::More よりテストを書くのも読むのも楽になった。

deploy が必要なリグレッションテストはさすがに t/ の下に入れておくのはどうかと思う。 プロジェクト的にはビルドサーバを用意して、そこで自動的にテストできるような環境を用意するのが良さそうだ。

[ 9月13日全て ]

2010年5月10日 (月)

今日のさえずり: オフィスの冷蔵庫なか卯の紅生姜が3袋も

2010年05月10日

  • 09:35 「網棚のお荷物をお確かめください」と車内放送。ゴールデンウィーク明けは土産とボケが多いという事か。
  • 12:20 やっぱり植木鉢の底7cm四方ではなかったらしい。スミマセン。
  • 14:32 [note] [Perl] Test::More ベースのテストでテストサブルーチンを作成する http://goo.gl/fb/PxaPC
  • 16:03 オフィスの冷蔵庫なか卯の紅生姜が3袋も保存されていた。
  • 16:06 4月分の給与明細リクエストしてきた。
  • 16:09 今月分から小遣い帳Android アプリケーション「かけ〜ぼ」につけてみることにした。Cashbook 用に買ったものを Twitter に投稿するのはとりあえず止め。Cashbook にエクスポート機能があればもっと使い続けたいんだけれどな。 #Xperia
  • 18:16 眼鏡が出来上がったらしい。
  • 18:31 ありがとうございます。 Cashbook エクスポート機能がつくと入力したデータが活用できるようになってとても嬉しいです。 RT @exdesign: エクスポート機能やりましょう。
  • 19:25 目覚まし時計の電池が切れて非常に危険な状態なのである。
  • 19:26 ということでヨドバシカメラ。
  • 19:40 電池とパズル購入。 (@ ヨドバシカメラ マルチメディアAkiba w/ 7 others) http://4sq.com/77WGwe
  • 19:57 眼鏡新しいのきたらアイコン変えるべきか否か。
  • 20:03 駅に鶴見大学の広告
  • 20:17 買い物の追加はケータイメールもらうよりも RTM に送ってもらった方が楽じゃん(オレが)。ケンカの種になりそうだからよしとくけど。
[ 5月10日全て ]

2011年1月19日 (水)

Test::More の TODO: は無意味

PerlTest::More を使ったテストを修正していて、fail するけど今すぐ直せないのがあったので TODO: { } で囲ったんだけれど何も変わらないじゃない。 あれそんな時は perldoc Test::More の TODO: BLOCK サブセクションでも TODO: { } で囲ってるじゃん。

「そもそもテストが TODO: な ブロック内だってことどうやって判定しているのよ、どんな Perl マジック?」と調べたら…… $TODO 変数設定されているか見ているだけだった(あるいは Test::More->builder->{Todo} が defined か)。 ドキュメント中の local $TODO = $why; の方が肝だった。 ああ、それは説明文するための optional な設定だと思ってたよ。

そもそも TODO: って文法的にはブロックの名前じゃなくてただのラベルか? ということで

 TODO: {
   local $TODO = $why;

   ok( foo(),       $test_name );
   is( foo(42), 23, $test_name );
 };

 {
   local $TODO = $why;

   ok( foo(),       $test_name );
   is( foo(42), 23, $test_name );
 };

でいい訳で。完全に人向けの飾りだった。

「TODO:」? あんなの飾りです。偉い人にはそれがわからんのですよ。

良い子のみんなは $TODO 多用しちゃ駄目だぞ。

2011年1月20日追記

@tokuhirom 情報より。

Test::More::todo_skip を使う場合は中で last TODO; しているので TODO: が必要。 ちなみに Test::More::skip の中では last SKIP; しているので SKIP: が必要。

今日のさえずり: 1万円たれぱんだぬいぐるみとバイバイしてきた

うんこ!

2011年01月19日

  • 08:28 1万円たれぱんだぬいぐるみとバイバイしてきた。
  • 12:28 「うんこ!」っていうのがMOE絵本屋さん大賞第1位らしい。
  • 12:31 チラッと見たらうんこが歩いてた。
  • 12:34 ビッグマックセット 590円。 (@ マクドナルド 秋葉原昭和通り店) http://4sq.com/en9GEB
  • 12:35 この歳になってもうんこに弱い。
  • 12:46 これだ。 http://amzn.to/hkQT6N 子供は絶対喜ぶ。 RT @Naney: 「うんこ!」っていうのがMOE絵本屋さん大賞第1位らしい。
  • 14:35 Test::More で TODO: {} で囲めばいいの何故だろうってソースコード見たら勘違いだった。$TODO 見てるだけなのか(あるいは Test::More->builder->{Todo} が defined か)。 #Perl
  • 14:35 Test::More での TODO: {} のブロック名は何でもよかった。 #Perl
  • 14:36 Test::More->builder->todo_start と Test::More->builder->todo_end も理解した。 #Perl
  • 14:37 @__gfx__ 今時の TODO のやり方ってどんなですか? #Perl
  • 14:45 あ、TODO: {} の TODO: ってもしかしてただのラベルか。文法的に何だろって思ってた。 #Perl
  • 14:46 @__gfx__ perldoc Test::More 通りですね。
  • 14:49 「TODO:」? あんなの飾りです。偉い人にはそれがわからんのですよ。 #Perl
  • 15:23 Test::Harness の prove に --state なんてオプションがあったんだ。 prove --state=save して以降 prove --state=failed,save すると。 #Perl
  • 15:28 RT @pomchon: 1月23日は秋葉原の歩行者天国復活の日なので、私の会社は毎年祝日となるそうです。社長が朝礼で宣言しました。
  • 16:08 ああ、こういう場合は git-cherry-pick か。
  • 16:19 ちょっとドキドキするバグ発見。
  • 18:38 あれ、今 Test::Harness::TAP って無くなっちゃったのか。TAP仕様今いずこ。 #Perl
  • 18:42 Test-Harness-2.64 には Test::Harness::TAP がある。 #Perl
  • 18:46 本題は「このテストスクリプト、Thread::async で実行しているブロックの中で is() しちゃってて TAP で吐く test number が重複しちゃってるんですけど」。 #Perl
  • 18:58 @__gfx__ とりあえず : shared な変数に結果を入れて join してからまとめて is() するようにしました。
  • 19:01 @__gfx__ perldoc Test::More 再びみてみました。ほんとだ use threads; use Test::More しましょうって書いてありますね。 #Perl
  • 19:04 use threads; use Test::More; したらサクッと直った。 TNX @__gfx__
  • 19:55 Xperiaアイコンが 3G になったり H になったりする。
  • 21:04 NTTドコモ電池パック安心サポート、スマートフォンは7月1日から要1500ポイントになるのか。4月になったらすぐもらいにいこう。
[ 1月19日全て ]

2011年1月20日 (木)

今日のさえずり: しばらくやってないけどワタナベさんのが入ったメールが毎日届いてます

絶叫委員会

2011年01月20日

[ 1月20日全て ]

2013年4月9日 (火)

今日のさえずり: Test::Class とか8年ぐらい前に試そうとしてやめた形跡がある

2013年04月09日

[ 4月9日全て ]

2013年8月28日 (水)

PerlTest::More の is 呼び出しで () つけないと動かなくなるのはなぜ?

テストスクリプトで 「クラスメソッドの返り値のアサーションで、is に括弧をつけると動くけれど、とると動かなくなるのはなぜ?」とチームメンバに質問された。

 #!/usr/bin/perl

 use warnings;
 use strict;
 use 5.10.0;

 package MyClass;

 sub color { 'blue' };

 package main;

 use Test::More;

 is(MyClass->color, 'blue');
 is MyClass->color, 'blue'; # wrong!

 done_testing;

簡略化すると上のような感じ。実行すると、

 Useless use of a constant (blue) in void context at sample.t line 16.
 ok 1
 Can't locate object method "is" via package "MyClass" at sample.t line 16.
 # Tests were run but no plan was declared and done_testing() was not seen.

となる。

これは間接オブジェクト構文(indirect object syntax)の罠にハマったケースだね。 間接オブジェクト構文は、例えば C++ の new っぽく

 my $obj = new MyClass;

と書ける構文(MyClass::new が呼ばれる)。前述では MyClass::is 呼ぼうとして怒られていると。間接オブジェクト構文は perldoc perlobj で説明されている。

ちなみにis じゃなくて組み込み関数だと違う解釈になる。

 say(uc MyClass->color);

とすると MyClass::uc が呼ばれるのではなくて uc(MyClass->color) と解釈されるので "BLUE\n" が出力される。

また以下みたいに、意図しないまま動いちゃう場合もあるので注意かな。

 #!/usr/bin/perl

 use warnings;
 use strict;
 use 5.10.0;

 package MyClass;

 sub color { 'blue' };

 sub is { 'MyClass2' }

 package MyClass2;

 sub color { 'red' };

 package main;

 use Test::More;

 is MyClass->color, 'green';

 done_testing;

これだと MyClass::is が呼ばれて 'MyClass2' が返ってきて、そして MyClass2 の color が呼ばれて 'red' が返ってくる(そして 'green' は使われないし、Test::More::is も実行されない)。

 Useless use of a constant (green) in void context at sample.t line 21.
 1..0
 # No tests run!

困ったらカッコつけようぜ。

[ 8月28日全て ]

About

Naney Naneymx

Naney (なにい) です。株式会社MIXIで SNS 事業の部長をしています。

※本サイトの内容は個人的見解であり所属組織とは関係ありません。

Process Time: 0.058239s / load averages: 0.17, 0.18, 0.20