時間に敏感なソフトウェアをどのようにテストしますか?


9

時間に依存するとは、たとえば、月に1回だけ実行されるスクリプト、または継続的に実行され、月に1回だけ特定の出力を提供するスクリプトを意味します。もちろん、多くのケースで単体テストを実行できますが、例外があります(私の理解では)。

私が最近遭遇した例は、毎月2日から最終日に実行されるようにcronジョブを設定することでした。これには、cronタブでシェルスクリプトを使用して、cronの正しい日を取得する必要がありました。

1 0 [shell command] * * [my script]

私はスクリプトに慣れておらず、シェルスクリプトにも慣れていなかったため、月末が来るのを待ってスクリプトが正しく実行されるかどうかを確認する以外に、スクリプトをテストする良い方法はありませんでした(実際、私の解決策はco-私がしたcronとシェルスクリプトについてもっと知っている労働者)。

ですから、時間に敏感なスクリプトをテストするための有用な回避策があるかどうか知りたいです。


3
これをVMで実行し、システム時刻を、スクリプトを実行する日の真夜中などの便利な時刻に設定することもできます。
Vitor Py

2
crontabは通常のシェルスクリプトを実行します
。crontab

2
私の答えは、おそらくあなたの特定のケースではやり過ぎです:スクリプトを実行するだけです。しかし、より大きな問題には、仮想化や計測などのソリューションが必要です。
マクニール2011

回答:


7

単体テストに加えて、OS固有の問題に対処するための自動テストをセットアップするための2つの戦略があります。

  • 仮想化:必要な正確な構成でいくつかのOSイメージを(たとえば、VMWareを使用して)セットアップし、バイナリを自動的にプルしてテストする方法をセットアップし(通常、特別なディレクトリをVMのスペースにマウントすることによって)、次にテスト。

または:

  • インストルメンテーションifプログラムに異なる動作をさせる特別な条件をプログラムに手動で追加します。Unixでは、これはのような特定の環境変数が設定されているかどうかをチェックすることで行われますFOOBAR_TEST_TIME_WITH_T=500。自動化されたテストは、環境変数の異なる設定と異なる環境変数を使用して、必要なものを実行します。

インタラクションをライブラリレベルで表現できる場合は、さまざまなライブラリにリンクすることもできます。これは、仮想化(「ライブラリ」がOSカーネルの場合)または計測手法と考えることができます。現在使用されている仮想化という用語は、ほとんど常にVMWareのようなものを意味しますが、両方の用語を使用できます。あらかじめ用意された値を返すため、または特定の相互作用を再実行するためのライブラリは、モックまたはスタブアプローチです。

ファイルシステムがいっぱいになっているなど、他の必要な効果を得るためにバイナリを書き換えることができる自動計測ツールもあります。

全体として、あなたの目標はバグを見つけることです。ファイルシステムがいっぱいになっているなどの奇妙なケースを確認するには、プログラムを手動でインストルメント化し、仮想化または手動のマシン構成ルートを使用することはほとんどありません。


あなたの「ライブラリ仮想化」は、モック、またはむしろモックライブラリを使用することとしてよく知られています。
ハビエル

10

最も効果的-テストするマシンの日付を変更します。実行する必要があるときの少し前に設定し、開始時と正しく実行されることを確認します。ただし、複数のマシンが関与している場合、または会社が制御できないリソースが必要な場合は、これが常に可能であるとは限りません。ただし、複数の月間実行していること、および2月をテストするために年を数回変更していることを確認してください。


1
ソフトウェアを(評価)ライセンスで一定期間インストールした場合、時計をいじると、実行がブロックされることがあります。
Marjan Venema

一部の企業では、ネットワークにログインしているすべてのワークステーションが「サーバー」の時間から5分ずれるべきではありません。そうでない場合、ワークステーションがロックされます。それは私に起こりました:-)
OnesimusUnbound 2013年

1

スクリプトについてはわかりませんが、日付を設定できるようなパラメータを使用しようとしています。あなたのケースでは、日付が指定されていない場合、デフォルトで月末になります。コードで、日付パラメーターを取り、今日が2日前であれば実行します。テスト(2日後の日付を渡す)だけでなく、通常の状況(電源障害、サーバーのダウンなど)で実行が妨げられた場合に備えて、翌日も実行できます。


1

crontabについて説明したので、nix環境で実行していると思います。その場合は、libfaketimeをチェックしてみてください。http:
//www.code-wizards.com/projects/libfaketime/

LD_PRELOADの魔法を通じて、ライブラリ関数のカスタムバージョンを、それらがインターフェイスと一致している限り、ロードできます。libfaketimeが行うことは、環境変数を介して動作をカスタマイズできるようにする、時間システムコールのロードバージョンです。すべてのボックスに影響を与えることなく、time()にハードコードされた値または現在の時刻からのオフセットを強制的に返すことができます。


0

cronは多くの世代でテスト済み(「本番テスト」)なので、テストする必要はあまりありません。もちろん、シェルスクリプトを使用している場合は、仮想マシンで日付/時刻を設定することができます。

これに対処するための推奨される方法は、「時計をあざける」ことであり、あるプログラミングトリックまたは別のプログラミングトリックを使用して時間を偽ります。シェルスクリプトでは、$ {:-}構文を使用して環境変数に設定された日付を使用し、強制されていない場合は実際の時刻にフォールバックできます。

他の言語では、モックライブラリを使用するか、24時間抽象化を構築します。

モッククロックは、手動でテストをセットアップする必要がなく、自動化できるため、優れています。これは、後でスクリプト/コードを変更するときに非常に大きな利点であり、それがまだ機能しているかどうかを簡単に確認できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.