Si vous écrivez un test piloté par table go en python, il peut être préférable d'utiliser subTest

introduction

Il semble que les gens de la zone go préfèrent écrire des tests unitaires dans un format appelé test piloté par table (bien que d'autres langages fassent de même). Je ne l'ai pas inventé parce qu'il existait ou existait).

J'ai réfléchi à ce qu'il fallait faire si j'écrivais un test piloté par table en python.

Ecrire normalement avec unittest est long

Par exemple, supposons que vous souhaitiez tester une fonction appelée add comme ceci:

def add(x, y):
    return x + y

Si vous l'écrivez honnêtement dans la plage du module unittest de python, cela ressemble à ce qui suit.

import unittest


class Tests(unittest.TestCase):
    def _callFUT(self, x, y):
        from add import add
        return add(x, y)

    def test_with_positive(self):
        actual = self._callFUT(10, 10)
        self.assertEqual(actual, 20)

    def test_with_zero(self):
        actual = self._callFUT(10, 0)
        self.assertEqual(actual, 10)

    def test_with_negative(self):
        actual = self._callFUT(10, -10)
        self.assertEqual(actual, 0)

    def test_with_biiiiiiiiiig(self):
        actual = self._callFUT(
            10,
            10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,
        )
        self.assertEqual(
            actual,
            10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010,
        )

longue. Je suis fatigué.

(CallFUT est religieux. Voir cette zone pour plus de détails)

table driven test

Le test piloté par la table donne une sensation nette. Il semble bon d'utiliser subTest.

import unittest
from collections import namedtuple


class Tests(unittest.TestCase):
    def _callFUT(self, x, y):
        from add import add
        return add(x, y)

    def test_it(self):
        C = namedtuple("C", "msg x y expected")
        candidates = [
            C(msg="with positive", x=10, y=10, expected=20),
            C(msg="with zero", x=10, y=0, expected=10),
            C(msg="with negative", x=10, y=-10, expected=0),
            C(
                msg="with biiiiiiig",
                x=10,
                y=10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,
                expected=10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010,
            ),
        ]
        for c in candidates:
            with self.subTest(msg=c.msg):
                actual = self._callFUT(c.x, c.y)
                self.assertEqual(actual, c.expected)

Voici mes préférences personnelles

--Utilisation de namedtuple --Écrire des msg ensemble --_ callFUT (Si la méthode de test se termine par un, il peut ne pas être nécessaire de le séparer)

Comment compter le nombre de sous-tests

En cas de succès, il sera compté comme un.

.
----------------------------------------------------------------------
Ran 1 test in 0.002s

OK

S'il échoue, il sera compté comme N, ce qui est bien.


======================================================================
FAIL: test_it (__main__.Tests) [with positive]
----------------------------------------------------------------------
Traceback (most recent call last):
  File "tests.py", line 26, in test_it
    self.assertEqual(actual, c.expected + 1)
AssertionError: 20 != 21

======================================================================
FAIL: test_it (__main__.Tests) [with zero]
----------------------------------------------------------------------
Traceback (most recent call last):
  File "tests.py", line 26, in test_it
    self.assertEqual(actual, c.expected + 1)
AssertionError: 10 != 11

======================================================================
FAIL: test_it (__main__.Tests) [with negative]
----------------------------------------------------------------------
Traceback (most recent call last):
  File "tests.py", line 26, in test_it
    self.assertEqual(actual, c.expected + 1)
AssertionError: 0 != 1

======================================================================
FAIL: test_it (__main__.Tests) [with biiiiiiig]
----------------------------------------------------------------------
Traceback (most recent call last):
  File "tests.py", line 26, in test_it
    self.assertEqual(actual, c.expected + 1)
AssertionError: 10000[33 chars]000000000000000000000000000000000000000000000000000000000000010 != 10000[33 chars]000000000000000000000000000000000000000000000000000000000000011

----------------------------------------------------------------------
Ran 1 test in 0.003s

FAILED (failures=4)

Lors de l'utilisation de pytest

Quelqu'un peut-il écrire sur un test piloté par table à l'aide de pytest?

Recommended Posts

Si vous écrivez un test piloté par table go en python, il peut être préférable d'utiliser subTest
Si vous écrivez TinderBot en Python, elle peut le faire
N'écrivez pas Python si vous voulez l'accélérer avec Python
Si vous souhaitez compter les mots en Python, il est pratique d'utiliser Counter.
Deux outils de génération de documents que vous souhaitez absolument utiliser si vous écrivez python
Si vous utilisez la fonction de tracé de Pandas en Python, elle est vraiment transparente du traitement des données à la création de graphiques
Je veux écrire en Python! (2) Écrivons un test
Comprendre le rendement Python Si vous mettez le rendement dans une fonction, elle se transforme en générateur
Comme vous le savez peut-être, Python peut être écrit comme ceci
Si vous écrivez TinderBot en Python, elle peut le faire
Code Python qui continue de tweeter "Bals" autant que vous le pouvez
Ecrire le code de test du sélénium en python
Vous devez savoir si vous utilisez Python! 10 bibliothèques utiles
Écrire du code dans UnitTest une application Web Python
Combien connaissez-vous les bases de Python?
Si vous ne comprenez pas les symboles mathématiques, vous pouvez écrire un programme.
Si __name__ == Levez la main, si vous écrivez le code sous '__ main__'
Si vous écrivez un test piloté par table go en python, il peut être préférable d'utiliser subTest
L'utilisation du japonais pour les noms de dossier et les noms de bloc-notes dans Databricks peut poser problème
[Python] Comment écrire une instruction if en une phrase.
[Route vers Python intermédiaire] Utiliser l'instruction if dans la notation d'inclusion de liste
traitement pour utiliser les données notMNIST en Python (et essayé de les classer)
Que faire si vous obtenez moins zéro en Python
Le configurateur de [python] python peut être meilleur que la gestion des paramètres avec yaml
[Python] Lorsque vous souhaitez utiliser toutes les variables dans un autre fichier
Si vous souhaitez affecter une exportation csv à une variable en python
Indispensable si vous utilisez Python! Comment utiliser Numpy pour accélérer les calculs!
Que faire si vous ne pouvez pas utiliser la poubelle dans Lubuntu 18.04.
Mettre en œuvre un test piloté par table en Java
Comment utiliser SQLite en Python
Ecrire le code de test du sélénium en python
Comment utiliser Mysql avec python
Comment utiliser ChemSpider en Python
Comment utiliser PubChem avec Python
Si pip s'arrête à cause de SSL, il est préférable de réinstaller python lui-même
Lors de l'écriture d'un test en utilisant DB avec django, il peut être plus rapide d'utiliser `setUpTestData ()`
Ecrire le test dans la docstring python
Comment utiliser Google Test en langage C
Comment afficher la table quatre-vingt-dix-neuf en python
Un moyen simple d'utiliser Wikipedia avec Python
Comment utiliser __slots__ dans la classe Python
Comment utiliser is et == en Python
Comment écrire Ruby to_s en Python
Si vous ajoutez sudo dans ubuntu, il sera appelé le python par défaut.
[Python] Comment nommer les données de table et les sortir avec csv (méthode to_csv)
Si vous écrivez View decorator dans urls.py dans Django, la liste sera plus élevée.
Utilisez PIL en Python pour extraire uniquement les données souhaitées d'Exif
Si une exception survient dans la fonction, elle sera transmise à l'appelant 2
Que faire si vous obtenez «Python non configuré». Utilisation de PyDev dans Eclipse
Comment écrire un fichier auquel vous devez faire attention dans toutes les langues
Si vous voulez créer un bot discord avec python, utilisons un framework
Si une exception survient dans la fonction, elle sera transmise à l'appelant 1
Si vous essayez d'installer Python2 pip après avoir installé Python3 pip et qu'il est rejeté