web-dev-qa-db-ja.com

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

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

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

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

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

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

9
DanLeaningphp

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

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

または:

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

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

自動インスツルメンテーションツールもあります。これは、バイナリを書き換えて、ファイルシステムがいっぱいになったなど、他の目的の効果を得ることができます。

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

7
Macneil

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

10
Lyndon Vrooman

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

1
JeffO

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

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

1
frankc

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

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

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

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

0
Tim Ottinger