1

最初のテストが失敗したとしても、TestCase 内のすべてのアサーション テストが実際にテストされることを望みます。私の状況では、すべてのアサーションは同じ性質のものです。

実際、私はPythonオブジェクトとして書かれた式を評価するものを持っています(文字列として書かれた式を計算してevalください)。私は次のようなことをしたいと思います:

class MyTest(TestCase):
   def test_something(self):
       for id in ids:
           for expression in get_formulas(id):
                for variable in extract_variables(expression):
                    self.assertIn(variable, list_of_all_variables)

=> !variableにないすべての を表示したいlist_of_all_variables

これは、いわゆる数式をすべて確認し、エラーを修正できるようにするために必要です。

もう少しコンテキスト:

1 つのアプリで (バージョン管理されたデータ ファイルに書き込まれた ID のリストに応じて) さまざまな数のテストを実行しています。

可変数の TestCase インスタンスを作成するために、基本クラス (mixin) を作成し、3-argstype関数を使用してその場でクラスを作成しました (つまり、クラスを作成します)。

このように、さまざまな IDnに対応するテストがあります。nこれは最初のステップですが、私が望んでいるのは、これらのテストのすべてのアサーションがテストされ、対応するアサーション エラーが出力されることです。

4

1 に答える 1

1

Continueing in Python's unittest when an assertion fails という質問で参照されているように、アサーション エラーでの失敗は、TestCaseクラスのハードコーディングされた動作です。

そのため、動作を変更する代わりにtest_...、次のスタイルでクラスにさまざまなメソッドを多数生成しました。

from django.test import TestCase
from sys import modules


# The list of all objects against which the tests have to be performed
formids = [12,124,234]
# get_formulas returns a list of formulas I have to test independently, linked to a formid
formulas = {id: get_formulas(id) for id in formids}

current_module = sys.modules(__name__)

def test_formula_method(self, formula):
    # Does some assertions
    self.assertNotEqual(formula.id, 0)

for formid in formids:
    attrs = {'formid': formid}
    for f in formulas[formid]:
        # f=f so the 2nd arg to test_formula_method is staying local
        # and not overwritten by last one in loop
        attrs['test_formula_%s' % f.name] = lambda self, f=f: test_formula_method(self, f)

    klass_name = "TestForm%s" % formid
    klass = type(klass_name, (TestCase,), attrs)

    setattr(current_module, klass_name, klass)
于 2014-10-22T11:36:12.227 に答える