34

I am new to Python and trying to do something I do often in Ruby. Namely, iterating over a set of indices, using them as argument to function and comparing its results with an array of fixture outputs.

So I wrote it up like I normally do in Ruby, but this resulted in just one test case.

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

I'm trying to get the test for every item in the range. How can I do that?

4

4 回答 4

25

从 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

于 2016-06-28T07:55:23.573 回答
16

使用 unittest,您可以在一个测试用例中显示两个序列之间的差异。

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)

类似的问题:

于 2013-09-28T21:14:36.810 回答
14

在 python 世界中,编写测试的两个最流行的选项是:

在 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 已经两年了,它是一个非常好的工具。你有很多功能。除了参数化之外,还有固定装置,非常非常好的断言(您不需要编写 assertEqual,只需assert a==bpytest 可以为它生成非常好的和有用的输出。)

于 2013-09-28T21:34:31.450 回答
1

如果您的问题是关于,当您在诸如hackerrank 或其他任何地方的竞争场所解决问题时。如果他们没有提供环境来循环运行测试用例。

如果您在本地运行 python 编译器的代码,这将很有用。

您可以简单地使用 python 的 while 循环或范围函数。

例如:

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
于 2018-08-24T12:14:22.177 回答