[PYTHON] Fühlen Sie sich frei, einen Test mit der Nase zu schreiben (im Fall von + gevent)

Es gibt verschiedene Test-Frameworks für Python, aber ich persönlich mag das Framework namens Nase, weil es einfach ist und ich es gerne vorstellen möchte. Installation der Nase

$ pip install nose

Abhängig von Ihrer Umgebung benötigen Sie möglicherweise Sudo.

schreibe einen Nasentestfall

Angenommen, Sie haben die folgende Funktionssumme und die Funktion is_even in einem Modul namens hoge.

hoge.py


def sum(a, b):
	return a + b

def is_even(n):
	return (n % 2 == 0)

Erstellen Sie die folgende Datei test_hoge.py, die unittest.TestCase erbt. Hier werden eq_, um zu überprüfen, ob der Wert mit dem erwarteten ** Wert ** übereinstimmt, und ok_, um zu überprüfen, ob der Wert ** true ** ist, aus nas.tools importiert und verwendet. Ich werde. Als üblicher Mechanismus im Testframework werden "setUp" und "tearDown" für die Verarbeitung bereitgestellt, z. B. für die Initialisierung / Ressourcenfreigabe vor und nach dem Test. Versuchen Sie daher, eine print-Anweisung einzufügen.

test_hoge.py


from unittest import TestCase
from nose.tools import ok_, eq_
from hoge import sum, is_even

class HogeTestCase(TestCase):
	def setUp(self):
		print 'before test'
	def tearDown(self):
		print 'after test'
	
	def test_sum(self):
		eq_(sum(1, 2), 3)
		eq_(sum(5, 11), 16)
		eq_(sum(0, 0), 0)

	def test_is_even(self):
		ok_(is_even(2))
		ok_(not is_even(3))

Führen Sie den Testfall aus

Nase kommt mit einem Test-Runner-Befehl namens Nosetests. (Pip Install Nase wird es installieren) Wenn Sie hier Nosetests ausführen, ist dies wie folgt.

$ nosetests
..
----------------------------------------------------------------------
Ran 2 tests in 0.003s

OK

Wenn nosetests ausgeführt wird, sucht es im aktuellen Verzeichnis nach testähnlichen Dateien (einschließlich Test im Dateinamen) und sammelt und führt Klassen aus, die unittest.TestCase erben. Ich habe nicht die Nachricht erhalten, die ich mit der print-Anweisung hätte drucken sollen, da die Nase standardmäßig die Ausgabe auf die Standardausgabe erfasst. Sie können die Ausgabe so sehen, wie sie ist, mit der Option -s.

$ nosetests -s

Fügen Sie die Option -v hinzu, um den Namen des Testfalls, der ausgeführt wird, anhand des Methodennamens sowie des Punkts anzuzeigen.

$ nosetests -v

Als ich versuchte, es zusammen auszuführen, wurde es wie folgt.

$ nosetests -s -v
test_is_even (test_hoge.HogeTestCase) ... before test
after test
ok
test_sum (test_hoge.HogeTestCase) ... before test
after test
ok

----------------------------------------------------------------------
Ran 2 tests in 0.002s

OK

Sie können auch einen Dateinamen für den Befehl nosetests angeben, um nur Tests für bestimmte Dateien auszuführen. Es wäre praktisch, wenn die Entwicklung voranschreiten und die Tests zunehmen würden.

$ nosetests ./test_hoge.py

Andere Werkzeuge

Hier sind einige andere Testwerkzeuge für ok_ und eq_. Weitere Informationen finden Sie auf der Seite mit den Testtools von Nase (http://nose.readthedocs.org/en/latest/testing_tools.html).

raises

Verwenden Sie "Erhöhungen" als Dekorateur für Tests, die wahrscheinlich Ausnahmen verursachen. Testen Sie die folgende Funktion div, bei der wahrscheinlich eine Ausnahme auftritt.

fuga.py


def div(n, m):
	return n / m

Der Testfall ist unten.

fuga_hoge.py


from unittest import TestCase
from nose.tools import eq_, raises
from fuga import div
class FugaTestCase(TestCase):
	def test_div(self):
		eq_(div(10, 5), 2)
		eq_(div(10, 10), 1)
		eq_(div(9, 3), 3)

	@raises(ZeroDivisionError)
	def test_div_zerodiv(self):
		div(10, 0)

	

Jetzt können Sie überprüfen, ob der Testfall test_div_zerodiv die Ausnahme ZeroDivisionError ordnungsgemäß auslöst.

timed

timed ist ein Dekorateur, der prüft, ob ein Testfall innerhalb einer bestimmten Zeitspanne (in Sekunden angegeben) abgeschlossen ist. Stellen Sie sich einen Test vor, der überprüft, ob eine Funktion "do_something", deren Verarbeitung etwa 0,1 Sekunden dauert, innerhalb von 0,2 Sekunden abgeschlossen ist, z.

moge.py


import time
def do_something():
	time.sleep(0.1)

Der Testfall sieht folgendermaßen aus:

test_moge.py


from unittest import TestCase
from nose.tools import timed
from moge import do_something

class MogeTestCase(TestCase):
    @timed(0.2)
    def test_do_something(self):
        do_something()

Schreiben Sie einen Test eines Programms mit gevent

Für Programme, die gevent verwenden, wird empfohlen, die folgenden Dekoratoren zu verwenden.

gtest Dekorateur


import gevent
def gtest(func):
	def _gtest(*args, **kwargs):
		gevent.spawn(func, *args, **kwargs).join()
	_gtest.__name__ = func.__name__
	return _gtest

Testen wir ein Programm wie das folgende. _tick und _tacik bewegen sich abwechselnd, senden abwechselnd nummerierte Zeichenketten wie tick1, Tack1, Tick2, Tack2 an die Warteschlange und saugen schließlich den gesamten Inhalt aus der Warteschlange heraus und geben ihn als Array zurück Werde dir geben.

g.py


import gevent
import gevent.queue

def ticktack(n):
    q = gevent.queue.Queue()

    def _tick(_q, _n):
        for i in range(_n):
            _q.put('tick%d' % (i + 1))
            gevent.sleep()

    def _tack(_q, _n):
        for i in range(_n):
            _q.put('tack%d' % (i + 1))
            gevent.sleep()

    _tick_thread = gevent.spawn(_tick, q, n)
    _tack_thread = gevent.spawn(_tack, q, n)

    result = []
    while len(result) < n * 2:
        result.append(q.get())

    return result

Da gevent beim Aufruf von gevent.sleep () einen entscheidenden Greenlet-Schalter ausführt, werden immer zuerst das erzeugte _tick und später das erzeugte _tack aufgerufen.

Lassen Sie uns dies mit dem Dekorateur oben testen.

test_g.py


from unittest import TestCase
from nose.tools import eq_
import gevent

from g import ticktack

import gevent
def gtest(func):
    def _gtest(*args, **kwargs):
        gevent.spawn(func, *args, **kwargs).join()
    _gtest.__name__ = func.__name__
    return _gtest

class GTestCase(TestCase):
    @gtest
    def test_ticktack(self):
        r1 = ticktack(1)
        eq_(r1, ['tick1', 'tack1'])
        r2 = ticktack(2)
        eq_(r2, ['tick1', 'tack1', 'tick2', 'tack2'])

Hast du dich gut gefühlt

Zusammenfassung

--nose macht es einfach und leicht, Testfälle zu schreiben --nosetests bietet verschiedene Optionen und kann flexibel ausgeführt werden

Ich hoffe, es hilft.

Recommended Posts

Fühlen Sie sich frei, einen Test mit der Nase zu schreiben (im Fall von + gevent)
Schreiben Sie den Test in die Python-Dokumentzeichenfolge
Fühlen Sie sich frei, das Legendenlabel mit Seaborn in Python zu ändern
So geben Sie mit Jupyter Notebook einen Wert in der Mitte einer Zelle aus
So erhalten Sie mit Python eine Liste der Dateien im selben Verzeichnis
Ich möchte in Python schreiben! (2) Schreiben wir einen Test
Wie identifiziere ich das Element mit der geringsten Anzahl von Zeichen in einer Python-Liste?
Notieren Sie sich, was Sie in Zukunft mit Razpai machen möchten
Rufen Sie die Excel-Liste rekursiv in einem bestimmten Ordner mit Python ab und schreiben Sie sie in Excel.
Ich schrieb einen Test in "Ich habe versucht, die Wahrscheinlichkeit eines Bingospiels mit Python zu simulieren".
Schreiben Sie einen tabellengesteuerten Test in C.
Fühlen Sie sich frei, die Festplatte zu verschlüsseln
Verarbeiten Sie den Inhalt der Datei der Reihe nach mit einem Shell-Skript
So bestimmen Sie die Existenz eines Selenelements in Python
So überprüfen Sie die Speichergröße einer Variablen in Python
[Einführung in StyleGAN] Ich habe mit "The Life of a Man" ♬ gespielt
Geben Sie den Inhalt von ~ .xlsx im Ordner mit Python in HTML aus
Ich habe den Code geschrieben, um den Brainf * ck-Code in Python zu schreiben
So überprüfen Sie die Speichergröße eines Wörterbuchs in Python
So ermitteln Sie die Scheitelpunktkoordinaten eines Features in ArcPy
Wie erstelle ich eine große Menge an Testdaten in MySQL? ??
Schreiben Sie ein Skript, um die Entfernung mit dem Elasticsearch 5-System schmerzfrei zu berechnen
Erstellen Sie eine Funktion, um den Inhalt der Datenbank in Go abzurufen
Ausbeute in einer Klasse, die unittest geerbt hat. TestCase funktionierte nicht mit der Nase (abhängig von der Version der Nase?)
So schreiben Sie, wenn Sie eine Zahl nach der Gruppennummer setzen möchten, die durch einen regulären Ausdruck in Python ersetzt werden soll
Die Geschichte eines Parksensors in 10 Minuten mit dem GrovePi + Starter Kit
Überlegen Sie, wie Sie einen Filter mit den Shotgun API-Contact-Versionen schreiben
Generieren Sie eine Liste mit der Anzahl der Tage im aktuellen Monat.
[Einführung in Python] So sortieren Sie den Inhalt einer Liste effizient mit Listensortierung
[Linux] Ein Befehl zum Abrufen einer Liste der in der Vergangenheit ausgeführten Befehle
Ich möchte eine Liste in der Reihenfolge anderer Listen sortieren
Einstellung, um den Inhalt der Bibliothek mit pytest einzugeben und einen Debug-Test durchzuführen
Erhalten Sie eine Liste der Ergebnisse der Parallelverarbeitung in Python mit Starmap
[Einführung in Python] So schreiben Sie eine Zeichenfolge mit der Formatierungsfunktion
Verschiedene Kommentare im Programm zu schreiben
Ich habe ein Programm erstellt, um die Größe einer Datei mit Python zu überprüfen
Ich habe einen Fehler beim Abrufen der Hierarchie mit MultiIndex von Pandas gemacht
Ich habe versucht, den Höhenwert von DTM in einem Diagramm anzuzeigen
Ich habe versucht, das Ergebnis des A / B-Tests mit dem Chi-Quadrat-Test zu überprüfen
[Python & SQLite] Ich habe den erwarteten Wert eines Rennens mit Pferden im 1x-Gewinnbereich ① analysiert
Ich wollte die Anzahl der Zeilen in mehreren Dateien wissen und versuchte, sie mit einem Befehl abzurufen
Verschiedene Möglichkeiten, die letzte Zeile einer CSV-Datei in Python zu lesen
So übergeben Sie das Ergebnis der Ausführung eines Shell-Befehls in einer Liste in Python
9 Schritte, um in kürzester Zeit Experte für maschinelles Lernen zu werden [Völlig kostenlos]
Wie man eine Benutzergruppe mit Slack-Benachrichtigung erwähnt, wie man die ID einer Benutzergruppe überprüft
[Python] Erstellt eine Klasse, um mit pyaudio Sinuswellen im Hintergrund zu spielen
So zählen Sie die Anzahl der Elemente in Django und geben sie in die Vorlage aus
[AWS] Lassen Sie uns einen Komponententest der Lambda-Funktion in der lokalen Umgebung durchführen
Beachten Sie die Lösung, da Django nicht mit pip installiert werden konnte
Überprüfen Sie mit einem Test, wie oft die Abfrage (SQL) in Django ausgelöst wurde
Ich habe einen Appdo-Befehl erstellt, um Befehle im Kontext der App auszuführen
Ich möchte einen Lebenszyklus in der Aufgabendefinition von ECS festlegen
Ein Memorandum zur Ausführung des Befehls! Sudo magic in Jupyter Notebook
SSH-Anmeldung am Zielserver von Windows mit einem Klick auf eine Verknüpfung
Ich möchte eine Liste der WebDAV-Dateien im Modul Anfragen anzeigen
Auf der Suche nach einer effizienten Möglichkeit, eine Docker-Datei mit Python mit Gedichten zu schreiben
Ich musste im Unterricht keinen Dekorateur schreiben. Danke Kontextmanager