2

私は、データベースや他のAPIとやり取りする必要のある厳しい依存関係を持つ多くの「単体テスト」を持つプロジェクトに取り組んでいます。テストは、私たちのチームにとって貴重かつ有用なリソースですが、テスト環境内の他のサービスの機能に頼ることなく、単独では実行できません。個人的に私はこれらの「機能テスト」と呼んでいますが、これはすでにチーム内で確立されているセマンティクスに過ぎません。Python単体テストをデータベース依存関係にする方法を教えてください。

問題は、より純粋な単体テストをコードに導入するようになったため、外部依存関係を持つ、または持たないテストのメドレーがあります。これらのテストは、他のツールをインストールまたは設定する必要がないコードをチェックアウトした直後に実行できます。また、ジェンキンのような継続的な統合環境で実行することもできます。

私の質問は、どうすればよりクリーンな分離ができるのかを示すことができます。ユニットテストライブラリ内に既存のデコレータがありますか?

+0

あなたのテストはクラスですよね?では、継承を使ってテストを分類する方法はありますか?継承は基本的に "A * is a * B"です。 Djangoはこれを行い、異なるレベルのデータベースアクセスを必要とするテストを区別します。 – spectras

+0

これをマークするのは簡単です。クラスにフラグを追加するだけです。ただし、テストパイプラインによって最適なものは異なります。どのようにテストを実行しますか? TestSuitesのセット、カスタム選択プロシージャ、単純な 'setup.py'を持っていますか? – MisterMiyagi

答えて

2

skipIfデコレータでスキップするテストを定義することができます。環境変数の設定と組み合わせて、いくつかの環境でテストをスキップできます。例:

from unittest import skipIf 

class MyTest(Testcase): 

    @skipIf(os.environ.get('RUNON') == 'jenkins', 'Does not run in Jenkins') 
    def test_my_code(self): 
     ... 
1

別のオプションがあります。ディレクトリごとに異なるテストカテゴリを分けることができます。あなたはこの戦略を試してみたかった場合、それはのようなものに見えることがあります。あなたのテストのパイプラインで

python -modules unit -pure unit test modules functional -other unit test modules

を、あなたのテストフレームワークのみが必要なテストを実行するために呼び出すことができます。たとえば、Pythonのunittestで、あなたの '純粋ユニットテスト' のpythonディレクトリ内から

python -m unittest discover --start-directory ../unit

と、機能/他のユニットテスト

python -m unittest discover --start-directory ../functional

とを実行することができこの設定の利点は、テストが簡単に分類され、各テスト環境で必要となる足場やモックアップされたサービスを実行できることです。もう少しPythonの経験がある人なら、現在のディレクトリに関係なくテストを実行するのに役立つかもしれません。

関連する問題