Wenn Sie einen go table-gesteuerten Test in Python schreiben, ist es möglicherweise besser, subTest zu verwenden

Einführung

Es scheint, dass Leute im Go-Bereich es vorziehen, Komponententests in einem Format namens tabellengesteuerter Test zu schreiben (obwohl andere Sprachen dasselbe tun). Ich habe es nicht erfunden, weil es existierte oder existierte.

Ich überlegte, was ich tun sollte, wenn ich einen tabellengesteuerten Test in Python schrieb.

Normalerweise mit unittest zu schreiben ist lang

Angenommen, Sie testen die folgende Funktion namens add.

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

Wenn Sie es ehrlich im Bereich des unittest-Moduls von Python schreiben, sieht es wie folgt aus.

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,
        )

lange. Ich bin müde.

(CallFUT ist religiös. Weitere Informationen finden Sie in diesem Bereich.)

table driven test

Der tischgetriebene Test vermittelt ein klares Gefühl. Es scheint gut zu sein, subTest zu verwenden.

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)

Unten sind meine persönlichen Vorlieben

So zählen Sie die Anzahl der Untertests

Bei Erfolg wird es als eins gezählt.

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

OK

Wenn es fehlschlägt, wird es als N gezählt, was gut ist.


======================================================================
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)

Bei Verwendung von Pytest

Kann jemand über einen tischgesteuerten Test mit pytest schreiben?

Recommended Posts

Wenn Sie einen go table-gesteuerten Test in Python schreiben, ist es möglicherweise besser, subTest zu verwenden
Wenn Sie TinderBot in Python schreiben, kann sie das tun
Schreiben Sie Python nicht, wenn Sie es mit Python beschleunigen möchten
Wenn Sie Wörter in Python zählen möchten, können Sie bequem Counter verwenden.
Zwei Tools zur Dokumentenerstellung, die Sie unbedingt verwenden möchten, wenn Sie Python schreiben
Wenn Sie die Plot-Funktion von Pandas in Python verwenden, ist sie von der Datenverarbeitung bis zur Diagrammerstellung wirklich nahtlos
Ich möchte in Python schreiben! (2) Schreiben wir einen Test
Python-Ertrag verstehen Wenn Sie Ertrag in eine Funktion einfügen, wird dieser in einen Generator geändert
Wie Sie vielleicht wissen, kann Python so geschrieben werden
Wenn Sie TinderBot in Python schreiben, kann sie das tun
Python-Code, der so oft wie möglich "Bals" twittert
Schreiben Sie Selentestcode in Python
Sie sollten wissen, ob Sie Python verwenden! 10 nützliche Bibliotheken
Schreiben Sie Code in UnitTest, eine Python-Webanwendung
Wie viel kennen Sie die Grundlagen von Python?
Wenn Sie die mathematischen Symbole nicht verstehen, können Sie ein Programm schreiben.
Wenn __name__ == Heben Sie Ihre Hand, wenn Sie den Code unter '__ main__' schreiben.
Wenn Sie einen go table-gesteuerten Test in Python schreiben, ist es möglicherweise besser, subTest zu verwenden
Es kann ein Problem sein, Japanisch für Ordnernamen und Notizbuchnamen in Databricks zu verwenden
[Python] Wie schreibe ich eine if-Anweisung in einen Satz?
[Road to Intermediate Python] Verwenden Sie die if-Anweisung in der Listeneinschlussnotation
Verarbeitung zur Verwendung von notMNIST-Daten in Python (und versucht, sie zu klassifizieren)
Was tun, wenn in Python minus Null angezeigt wird?
[python] Der Konfigurationsparser von Python ist möglicherweise besser als das Verwalten von Einstellungen mit yaml
[Python] Wenn Sie alle Variablen in einer anderen Datei verwenden möchten
Wenn Sie einer Variablen in Python einen CSV-Export zuweisen möchten
Unverzichtbar, wenn Sie Python verwenden! Wie man Numpy benutzt, um Berechnungen zu beschleunigen!
Was tun, wenn Sie den Papierkorb in Lubuntu 18.04 nicht verwenden können?
Implementieren Sie einen tabellengesteuerten Test in Java
Verwendung von SQLite in Python
Schreiben Sie Selentestcode in Python
Wie man MySQL mit Python benutzt
Verwendung von ChemSpider in Python
Verwendung von PubChem mit Python
Wenn pip aufgrund von SSL stoppt, ist es besser, Python selbst neu zu installieren
Wenn Sie einen Test mit DB mit django schreiben, ist es möglicherweise schneller, `setUpTestData ()` zu verwenden
Schreiben Sie den Test in die Python-Dokumentzeichenfolge
Verwendung von Google Test in C-Sprache
So zeigen Sie die neunundneunzig Tabelle in Python an
Einfache Möglichkeit, Wikipedia mit Python zu verwenden
Verwendung von __slots__ in der Python-Klasse
Verwendung ist und == in Python
Wie schreibe ich Ruby to_s in Python
Wenn Sie sudo in Ubuntu hinzufügen, wird es als Standardpython bezeichnet.
[Python] So benennen Sie Tabellendaten und geben sie mit csv aus (to_csv-Methode)
Wenn Sie View decorator in urls.py in Django schreiben, ist die Liste höher.
Verwenden Sie PIL in Python, um nur die gewünschten Daten aus Exif zu extrahieren
Wenn in der Funktion eine Ausnahme auftritt, wird diese an den Anrufer 2 übertragen
Was tun, wenn "Python nicht konfiguriert" angezeigt wird? Verwenden von PyDev in Eclipse
So schreiben Sie eine Datei, bei der Sie in allen Sprachen vorsichtig sein sollten
Wenn Sie einen Discord-Bot mit Python erstellen möchten, verwenden wir ein Framework
Wenn in der Funktion eine Ausnahme auftritt, wird diese an den Anrufer 1 übertragen
Wenn Sie versuchen, Python2 pip nach der Installation von Python3 pip zu installieren, wird dies abgelehnt