4

私は 3 番目の中規模プロジェクトを開始しようとしていますが、(人生で初めて) 単体テストの使用を開始したいと考えています。しかし、どの方法を使用するか、unitests と doctests のどちらを使用するかはわかりません。どの方法が最も効率的ですか、または初心者はどの方法を選択して実装する必要がありますか? ありがとう

4

1 に答える 1

9

私はたまたま単体テストを好みますが、どちらも優れた、よく開発されたテスト方法であり、Django によって十分にサポートされています (詳細については、こちらを参照してください)。要するに、それぞれにいくつかの重要な長所と短所があります。

単体テストの長所

  • unittestsより複雑なテストを簡単に作成できます。複数のヘルパー関数の呼び出し、反復、およびその他の分析を含むテストがある場合、doctest は制限を感じることがあります。unittests一方、Python コードを書いているだけです。Python でできることはすべて、Python で快適に行うことができます。このコード (私がかつて書いた単体テストの修正版) を使用します。

    def basic_tests(self, cacheclass, outer=10, inner=100, hit_rate=None):
        c = cacheclass(lambda x: x + 1)
        for n in xrange(outer):
            for i in xrange(inner):
                self.assertEqual(c(i), i + 1)
        if hit_rate != None:
            self.assertEqual(c.hit_rate(), hit_rate)
    
    def test_single_cache(self):
        self.basic_tests(SingleCache, outer=10, inner=100, hit_rate=0)
        sc = SingleCache(lambda x: x + 1)
        for input in [0, 1, 2, 2, 2, 2, 1, 1, 0, 0]:
            self.assertEqual(sc(input), input + 1)
        self.assertEqual(sc.hit_rate(), .5)
    

    basic_tests メソッドを使用してクラスに対していくつかのテストを実行し、次に for ループ内でアサーションを実行します。doctests でこれを行う方法はありますが、かなりの熟考が必要です。doctests は、関数への特定の個々の呼び出しが本来あるべき値を返すことを確認するのに最適です。(これは、単体テスト用の優れたツールを備えた Django 内で特に当てはまります (「参考文献」を参照django.test.client)。

  • doctests はコードを乱雑にする可能性があります。クラスやメソッドを書いているときは、メソッドが何をするのかを明確にするために、必要なだけ多くのドキュメントをドキュメント文字列に入れます。しかし、docstring が 20 行以上の長さの場合、コードと同じくらい多くのドキュメントがコード内にあることになります。これは、それを読んだり編集したりすることの難しさを増しています (プログラミング言語としての Python について私が気に入っている点の 1 つは、そのコンパクトさです)。

docstring の長所

  • テストは特定のクラスとメソッドに関連付けられています。これは、テストが失敗した場合、失敗したクラスとメソッドがすぐにわかることを意味します。ツールを使用して、クラス全体のテストのカバレッジを決定することもできます。(もちろん、テストでコードのさまざまな部分をカバーしたい場合は、これも制限になる可能性があります)。

  • テストはコードのすぐ隣にあるため、同期を維持しやすくなります。クラスやメソッドに変更を加えると、テスト ケースに対応する変更を加えるのを忘れることがよくあります (もちろん、それらを実行するとすぐに思い出すことができます)。メソッド宣言とコードのすぐ隣に doctest を配置すると、これが簡単になります。

  • テストは一種のドキュメントとして機能します。コードを確認する人は、各メソッドを呼び出して使用する方法の例を事前に含めることができます。

結論: 私は確かに単体テストを好みますが、どちらにも適したケースがあります。

于 2012-01-11T07:04:48.670 に答える