web-dev-qa-db-ja.com

ループ内で複数のPythonテストケースを実行するにはどうすればよいですか?

私はPython=に不慣れで、Rubyで頻繁に行うことを試みています。つまり、関数の引数としてそれらを使用し、その結果をフィクスチャ出力の配列と比較して、一連のインデックスを反復します。

そのため、Rubyで通常行うように記述しましたが、これによりテストケースは1つだけになりました。

  def test_output(self):
    for i in range(1,11):
      ....
      self.assertEqual(fn(i),output[i])

範囲内のすべてのアイテムのテストを取得しようとしています。どうやってやるの?

24
picardo

Unittestを使用すると、2つのシーケンスの違いをすべて1つのテストケースで表示できます。

seq1 = range(1, 11)
seq2 = (fn(j) for j in seq1)
assertSequenceEqual(seq1, seq2)

それが十分に柔軟でない場合は、unittestを使用して、複数のテストを生成することは可能ですが、少し注意が必要です。

def fn(i): ...
output = ...

class TestSequence(unittest.TestCase):
    pass

for i in range(1,11):
    testmethodname = 'test_fn_{0}'.format(i)
    testmethod = lambda self: self.assertEqual(fn(i), output[i])
    setattr(TestSequence, testmethodname, testmethod)

ノーズは上記を テストジェネレーター で簡単にします。

import nose.tools

def test_fn():
    for i in range(1, 11):
        yield nose.tools.assert_equals, output[i], fn(i)

同様の質問:

14

python 3.4から始めて、次のようにすることができます:

def test_output(self):
    for i in range(1,11):
        with self.subTest(i=i):
            ....
            self.assertEqual(fn(i),output[i])

https://docs.python.org/3.4/library/unittest.html?highlight=subtest#distinguishing-test-iterations-using-subtests

12

python世界では、テストを作成するための最も一般的な2つのオプションは次のとおりです。

Pytestでは、テストを非常に簡単にパラメーター化します。

@pytest.mark.parametrize(('param1', 'param2'),[
                         (1, 'go'),
                         (2, 'do not go')])
def test_me(param1, param2):
    # write test

これにより、テストの実行中にも素晴らしい出力が生成されます。

go.py:2: test_me[1-go] PASSED
go.py:2: test_me[2-do not go] PASSED

私はpytestを2年間使用していますが、これは非常に素晴らしいツールです。そこには多くの機能があります。パラメータ化の他に、フィクスチャもあり、非常にニースなアサーション(assertEqualを記述する必要はなく、assert a==bとpytestは、非常に便利で便利な出力を生成できます。)

9
spinus

あなたの質問が関係している場合、ハッカーランクなどの競争の激しい場所や他の場所で問題を解決しているとき。ループでテストケースを実行するための環境を提供していない場合。

そして、ローカルでpythonコンパイラのコードを実行している場合、それは便利でしょう。

pythonのwhileループまたはrange関数を使用するだけです。

例えば:

t = int(input("Enter Number of testcases"))
type(t)

while(t!=0):

    n = int(input("Enter number of data"))
    type(n)

    // Code logic or function Call

    t = t-1
1