Как запустить несколько тестовых случаев Python в цикле?

Я новичок в Python и пытаюсь сделать то, что я часто делаю в Ruby. А именно, итерация по набору индексов, использование их в качестве аргумента для функции и сравнение ее результатов с массивом выходов fixture.

поэтому я написал это, как обычно в Ruby, но это привело только к одному тестовому случаю.

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

Я пытаюсь получить тест для каждого элемента в диапазоне. Как я могу это сделать?

4 ответов


используя 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)

похожие вопросы:


в мире 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==b и pytest может генерировать очень хороший и полезный результат для него.)


начиная с 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


Если ваш вопрос касается, когда вы решаете проблему на конкурентных местах, таких как hackerrank или где-либо еще. Если они не предоставили свою среду для запуска тестовых случаев в цикле.

и локально, если вы используете код для компилятора python, это было бы полезно.

вы можете просто использовать цикл while или функцию диапазона python.

Эл.г:

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