web-dev-qa-db-fra.com

Comment exécuter plusieurs cas de test Python en boucle?

Je suis nouveau dans Python et j'essaie de faire quelque chose que je fais souvent dans Ruby. À savoir, itérer sur un ensemble d'indices, les utiliser comme argument pour fonctionner et comparer ses résultats avec un tableau de sorties de fixture .

Je l'ai donc écrit comme je le fais normalement dans Ruby, mais cela n'a abouti qu'à un seul cas de test.

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

J'essaie d'obtenir le test pour chaque article de la gamme. Comment puis je faire ça?

24
picardo

En utilisant unittest, vous pouvez montrer la différence entre deux séquences dans un même cas de test.

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

Si ce n'est pas assez flexible, en utilisant unittest, il est possible de générer plusieurs tests, mais c'est un peu délicat.

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)

Nose facilite ce qui précède grâce à générateurs de test .

import nose.tools

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

Questions similaires:

14
Trevor Merrifield

À partir de python 3.4, vous pouvez le faire comme ceci:

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
Antoine Fontaine

Dans python world, les deux options les plus populaires pour écrire des tests sont:

Dans pytest, vous paramétrez très facilement les tests:

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

Cela produira également une sortie Nice lors des tests:

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

J'utilise pytest depuis deux ans maintenant et c'est un très bel outil. Vous y avez de nombreuses fonctionnalités. Outre le paramétrage, il y a aussi des fixations, très très belles assertions (vous n'avez pas besoin d'écrire assertEqual, juste assert a==b et pytest peuvent générer une sortie très agréable et utile.)

9
spinus

Si votre question concerne, lorsque vous résolvez le problème sur des endroits compétitifs comme le hackerrank ou ailleurs. S'ils n'ont pas fourni leur environnement pour exécuter des cas de test en boucle.

Et localement si vous exécutez du code pour le compilateur python Ce serait utile.

vous pouvez simplement utiliser une boucle while ou une fonction range de python.

par exemple:

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
Sourav Choudhary