タグ別アーカイブ: test

Test::Mojo::DOMを作った

 

Mojoliciousアプリの出力するDOMを詳細にテストするやつ。

https://github.com/jamadam/Test-Mojo-DOM

Test::Mojoだけだと、domのチェックはelement_exitsとelement_exits_notしかできないので、詳細なテストはcontent_*でやるか、DOMを取り出してからTest::Moreを使う。

$t->get_ok('/');
my $dom = $t->tx->res->dom;
is $dom->at('#hoge')->attrs('href'), 'http://example.com', 'right URL';

Test::Mojoと似た流れでDOMのテストもやりたい!

ということで、Test::Mojo::DOMを使うと下記のようにできるよ。APIは変わるかもだよ。

  use Test::Mojo::DOM;
  use Test::More tests => 35;

  my $t = Test::Mojo::DOM->new(MyApp->new);
  $t->get_ok('/')
      ->status_is(200)
      ->dom_inspector(sub {
          my $t = shift;
          $t->at('a')
              ->attr_is('href', '../')
              ->attr_isnt('href', './')
              ->attr_like('href', qr'\.\./')
              ->attr_unlike('href', qr'\.\./a')
              ->text_is('some link')
              ->text_isnt('some link2')
              ->text_like(qr'some')
              ->text_unlike(qr'some2')
              ->has_attr('href')
              ->has_attr('empty')
              ->has_attr_not('not_exists');
          $t->at('a')->get(1)
              ->text_is('some link2');
          $t->at('a:nth-child(2)')
              ->text_is('some link2');
          $t->at('a')->each(sub {
              my $t = shift;
              $t->text_like(qr{.});
              $t->text_unlike(qr{a});
              $t->attr_like('href', qr{.});
              $t->attr_unlike('href', qr{a});
          });
          $t->at('a')->parent->attr_is('id', 'some_p');
          $t->at('a')->parent->parent->attr_is('id', 'wrapper');
          $t->at('#some_p')->has_child('a');
          $t->at('#some_p2')->has_child_not('a');

          $t->at('#some_img')->has_class('class1');
          $t->at('#some_img')->has_class('class2');
          $t->at('#some_img')->has_class('class3');
          $t->at('#some_img')->has_class_not('class4');
      });

サイトの異常をメール通知するMojoliciousアプリを作った

mojo-down-monitorっていうものを作った。Mojoliciousの自習と自作プラグインのテストを目的に作ったので、あまり人に勧められるものではありませんが。

自分のサイトがダウンしたことに気づかずに半日放置とかまずいので、以前はSite Alertというサービスを利用していましたが、いい自作ネタだと思ったので作ってみた次第です。

ブラウザ上のフォームでサイトのURLを登録し、URL毎に期待するステータスコードやContent-Type、コンテンツの内容などを設定します。アプリは定期的にサイトをGETし、指定された条件を全て満たしているかチェックします。異常があればサイト毎に指定したメアドに通知します。

Mojoliciousと、ビューの構築用の自作プラグイン「MojoX::Tusu」を使っています。あと、最近流行りのpjaxを真似た仕組みの画面遷移を試してみたりとか、あくまでExperimental。

アプリは下記のように起動。

$ hypnotoad ./script/mojo_down_monitor
Server available at http://127.0.0.1:8010.

停止。

$ hypnotoad ./script/mojo_down_monitor --stop

半月ほど前から、プライベートや仕事で作ったサイトに対して、1分毎にチェックを走らせてみてますが、正常に監視されてるようです。時間帯によって10秒のタイムアウトが頻発するサイトがいくつか見つかったり。

Linuxでは正常に動いてますが、Macの場合はメールが送られないようです。Postfixを有効にする的なひと手間が必要ぽいですが、あまり詳しく調べてません。

リンクチェッカー「mojo-checkbot」がv0.26になった

 

リンクチェッカー「mojo-checkbot」がv0.26になった。主な変更点。

  • embed, frame, iframe inputのsrc属性がクロールの対象となった。
  • formダイアログの表示条件を変更し、action属性と、子要素のname属性が全て同一でなければ、別のフォームとみなしてダイアログを表示するようにした。
  • ユーザー認証情報の使用範囲の条件にportの同一性を追加した。

リンクチェッカー「mojo-checkbot」がv0.24になった

 

mojo-checkbotがv0.24になった。

最近の変更点。目玉はform送信ダイアログの追加です。Basic認証やフォームでユーザー情報を送信する必要のある要認証サイトのチェックが楽になりました。

  • formを検出した場合、レポートビュー上からデータ送信してクローラーのキューを追加可能とした。
  • 401のユーザー認証を要求された場合、レポートビューからユーザー情報を送信可能とした。
  • matchオプションがDeprecatedになり、代わりにmatch-for-checkとmatch-for-crawlを追加した。
  • sleepオプションが全体のパフォーマンスに影響するのを改善した。

 

サイト内のリンク切れを一括検出する「mojo-checkbot」がβ版になった

mojo-checkbotがある程度できてきたのでベータ版にしてみたよ。githubでゲットできます。最新のバージョン番号のタグがついたものを使ってください。

mojo-checkbotはクローラーにウェブサイト内のステータスコードを収集させつつ、ブラウザでレポートを見れるコマンドラインツールです。checkbotの機能限定版という感じですが、日本語が正常に表示されたり、ファイルを介さないのでシンプルだったり、レポートの見せ方を工夫したりと、色々改善しています。

mojo-checkbotはMojoliciousをベースにしています。Mojolicious本体は同梱されてるのでインストール不要ですが、Mojoliciousのバージョン2からperl5.10.1依存になったので、以前のバージョンで動くかは不明です(5.10.0では動いてる風)。要改善点はまだ多数あるので逐一更新して行きます。見た目がダサいので誰かデザインしてくれませんか。

    mojo checkbot [--start start URL] [--match match string] [--sleep seconds]
        [--ua useragent header] [--cookie cookie string] [--timeout seconds]
        [--evacuate second] [--noevacuate] [--resume]

DESCRIPTION

ウェブサイトのリンクチェッカーです。コマンドラインで開始URLを指定してデーモンを起動し、ブラウザでhttp://127.0.0.1:3000 を開くとチェック状況が逐一報告されます。リンクの収集とステータスコードの収集は再帰的に延々続きますので、matchオプションでURLフィルタをかけておくと、そのうち止まるかもしれません。

OPTIONS

下記のオプションが利用可能です:

クローラーオプション

--start            クロールをスタートするURLを指定します。
--match         チェック対象のURLを正規表現で指定します。
--sleep        クロールの間隔を指定します。
--ua            クローラーのHTTPヘッダに設定するユーザーエージェントを指定します。
--cookie        クローラーがサーバーに送信するクッキーを指定します。
--timeout      クローラーのタイムアウトする秒数を指定します。デフォルトは15です。
--evacuate     [EXPERIMENTAL]レポートをテンポラリーファイルに出力する間隔を指定します。
--noevacuate            [EXPERIMENTAL]resume用のファイル出力を無効化します。
--resume                [EXPERIMENTAL]前回の結果を復元し、再開します。

レポートサーバーオプション

--backlog       Set listen backlog size, defaults to SOMAXCONN.
--clients       Set maximum number of concurrent clients, defaults to 1000.
--group         Set group name for process.
--keepalive     Set keep-alive timeout, defaults to 15.
--listen        Set one or more locations you want to listen on,
                defaults to "http://*:3000".
--proxy         Activate reverse proxy support, defaults to the
                value of MOJO_REVERSE_PROXY.
--requests      Set maximum number of requests per keep-alive
                connection, defaults to 25.
--user          Set username for process.
--websocket     Set WebSocket timeout, defaults to 300.

EXAMPLE1

$ mojo checkbot --start http://example.com --match http://example.com/ --sleep 2
[Mon Oct 17 23:18:35 2011] [info] Server listening (http://*:3000)
Server available at http://127.0.0.1:3000.

EXAMPLE2

本プログラムはMojolicious::Liteをベースにしていますので、そちらのオプションも有効なはずです。

$ mojo checkbot --listen http://*:3001 --start http://example.com

EXAMPLE3

クッキーを指定して要認証サイトのチェックもできます。

$ mojo checkbot --start http://example.com --cookie 
    'key=value; Version=1; Domain=example.com; Path=/; expires=Fri, 
    28 Oct 2011 15:26:47 GMT'

https://github.com/jamadam/mojo-checkbot

Copyright (c) 2011 jamadam

Dual licensed under the MIT and GPL licenses: