[PYTHON] Ich habe versucht, Pytest in die eigentliche Schlacht zu bringen

Charakteristisch

Dies bedeutet, für jedes Verzeichnis "conftest.py" zu schreiben.

tests
├── __init__.py
├── event
│   ├── __init__.py
|   |── conftest.py         #Allgemeiner Setup-Code
│   ├── battle_event_1207
│   │   ├── __init__.py
│   │   ├── conftest.py     #Setup-Code für zeitlich begrenzte Ereignisse
│   │   └── test_event.py
│   └── battle_event_1213
│       ├── __init__.py
│       ├── conftest.py     #Noch einer
│       └── test_event.py
└── logics
    └── __init__.py

Wie du es benutzt

__Web Framework verwendet Flask __

Unbenutztes Teil

Dies ist nur möglich, wenn Sie die Anwendungsspezifikationen verstehen und lernen, wie Sie das Webframework / Testframework verwenden.

_ Überlegen Sie, ob Sie Web Test oder Flask's integrierten Test verwenden möchten _

Stichprobe

Setup-Code

Es scheint gut zu sein, das Testziel zu importieren oder zu initialisieren. Wenn Sie eine Datei mit dem Namen "conftest.py" erstellen, liest pytest sie für Sie.

Außerdem sind die Funktionen, die mit "pytest_" beginnen, spezielle Funktionen und verwenden hauptsächlich "pytest_funcarg__xxxx (request)". Sie können dies verwenden, um Objekte, die von der Testfunktion abhängen, als Argumente zu übergeben. Wenn Sie auf der Seite der Testfunktion ein Argument mit dem Namen "xxxx" angeben, wird es dort übergeben.

conftest.py


# coding: utf-8
"""battle_event_1213 bootstrap.

Gemeinsame Verarbeitung von Modulen, die im Testcode verwendet werden
Erstellung von Testzielen usw.

"""

from datetime import datetime, timedelta


def pytest_report_header(config):
    """Testbericht-Header
    """
    return "battle_event_1213 Test"


def get_time_subtract_by_delta(seconds):
    return datetime.now() + timedelta(seconds=-1 * seconds)


#def pytest_addoption(parser):
#    parser.addoption('--ssh', action='store', default=None, help='specify ssh host to run tests with')


class MySetup(object):
    """Fabrik hier beschrieben
    """
    def getEventCls(self):
        from event_models.battle_event_1213 import Event
        return Event

    def makeEvent(self, *args, **kwargs):
        return self.getEventCls()(*args, **kwargs)


def pytest_funcarg__mysetup(request):
    """DI(Abhängigkeitsspritze)
Testfunktion/Im Argument der Methode`mysetup`Konkretisieren
    """
    return MySetup()


def pytest_funcarg__event(request):
    return MySetup().makeEvent()

Testcode

Sie können den Dekorator pytest.mark.skipif verwenden, um den Test zu überspringen, wenn die Bedingung erfüllt ist. Obwohl es sich um eine Funktion handelt, die bereits gelöscht wurde, ist es möglich, vorerst nur den Testfall zu belassen oder das Ablaufdatum anzugeben und die Funktion zu gegebener Zeit für eine begrenzte Zeit zu überspringen. Auf der Seite des Setup-Codes wird das von der Funktion pytest_funcarg__event (request ) zurückgegebene Objekt an das Argument event übergeben. Da Sie den Status des zu testenden Objekts testen möchten, der im Grunde von Anfang an eingerichtet wurde, entfällt durch die Verwendung von conftest.py die Einrichtung auf der Testcodeseite. Wie in diesem Beispiel können Sie den Dekorator pytest.mark.parametrize verwenden, um Eingabe- und Erwartungswerte zu übergeben, um den Aufwand des wiederholten Schreibens von Testfunktionen / -methoden zu vermeiden. Wie "pytest_funcarg__xxxx (request)" wird es an das Argument der Testfunktion übergeben.

test_event.py


# coding: utf-8
import pytest
from datetime import datetime


#Gültigkeitsdauer des Tests
is_timeout_event = datetime.now() > datetime(2012,12,19,23,59)
check_event_period = pytest.mark.skipif('%s' % is_timeout_event)

#Testparameter
EXCEEDED_GAUGE = 140
MAX_GAUGE = 100
MAX_ATTACK_PT = 4


#Wenn Sie einige Zeichen in skipif einfügen, wird der Test übersprungen(Ich habe die fehlerhafte Funktion gelöscht und den Test übersprungen)
@pytest.mark.skipif('"Das Messgerät verwendet ein großartiges Messgerät. Überspringen Sie diesen Test"')
class TestEventDame(object):
    @pytest.mark.parametrize('prop', [
        'dame_gauge',
    ])
    def test_exists_properties(self, event, prop):
        assert hasattr(event, prop)

    @pytest.mark.parametrize(('input_val', 'set_val', 'mode'), [
        (0, 0, False),
        (1, 1, False),
        (MAX_GAUGE, MAX_GAUGE, True),
        (EXCEEDED_GAUGE, MAX_GAUGE, True),
    ])
    def test_update_dame_gauge(self, event, input_val, set_val, mode):
        event.update_dame_gauge(input_val)
        assert event.dame_gauge == set_val
        assert event.is_dame() is mode

    @pytest.mark.parametrize(('value', 'expected'), [
        (0, 0),
        (1, 1),
        (2, 2),
        (3, 3),
        (4, 6),
    ])
    def test_get_attack_pt_effect(self, event, value, expected):
        result = event.get_attack_pt_effect(value)
        assert result == expected


#Überspringen Sie diesen Test am Ende des Zeitraums
@check_event_period
class TestEventSugoiGauge(object):
    @pytest.mark.parametrize('prop', [
        'attack_pt',
        'current_use_attack_pt',
        'update_datetime',
        '_use_full_attack_pt_count',
        '_use_full_attack_pt_count_with_win',
    ])
    def test_exists_properties(self, event, prop):
        assert hasattr(event, prop)

    @pytest.mark.parametrize(('value', 'expected'), [
        (0, False),
        (1, False),
        (2, False),
        (3, False),
        (4, True),
    ])
    def test_is_max_attack_pt(self, event, value, expected):
        assert event.is_max_attack_pt(value) is expected

    @pytest.mark.parametrize(('value', 'expected'), [
        (0, 1),
        (1, 2),
        (9, 10),
    ])
    def test_inc_use_full_attack_pt_count(self, event, value, expected):
        event._use_full_attack_pt_count = value
        event._use_full_attack_pt_count_with_win = value
        event.inc_use_full_attack_pt_count()
        event.inc_use_full_attack_pt_count_with_win()
        assert event._use_full_attack_pt_count == expected
        assert event._use_full_attack_pt_count_with_win == expected

    @pytest.mark.parametrize(('value', 'win_flag', 'expected', 'win_expected'), [
        (0, True, 0, 0),
        (1, True, 0, 0),
        (3, True, 0, 0),
        (MAX_ATTACK_PT, False, 1, 0),
        (MAX_ATTACK_PT, True, 1, 1),
    ])
    def test_set_use_full_attack_pt(self, event, value, win_flag, expected, win_expected):
        event.set_use_full_attack_pt(value, is_win=win_flag)
        assert event._use_full_attack_pt_count == expected
        assert event._use_full_attack_pt_count_with_win == win_expected


if __name__ == '__main__':
    pytest.main()

Fazit

Ich kann nicht zu Unittest zurückkehren

Referenz

Recommended Posts

Ich habe versucht, Pytest in die eigentliche Schlacht zu bringen
Ich habe versucht, den Ball zu bewegen
Ich habe versucht, den Abschnitt zu schätzen.
Ich habe versucht, den Befehl umask zusammenzufassen
Ich versuchte das Weckwort zu erkennen
Ich habe versucht, die grafische Modellierung zusammenzufassen.
Ich habe versucht, das Umfangsverhältnis π probabilistisch abzuschätzen
Ich habe versucht, die COTOHA-API zu berühren
Passende Karaoke-Tasten ~ Ich habe versucht, es auf Laravel zu setzen ~ <auf dem Weg>
Ich habe Web Scraping versucht, um die Texte zu analysieren.
Ich habe versucht, beim Trocknen der Wäsche zu optimieren
Ich habe versucht, die Daten mit Zwietracht zu speichern
Ich habe versucht, die Trapezform des Bildes zu korrigieren
Qiita Job Ich habe versucht, den Job zu analysieren
LeetCode Ich habe versucht, die einfachen zusammenzufassen
Ich habe versucht, das Problem des Handlungsreisenden umzusetzen
Ich habe versucht, die Texte von Hinatazaka 46 zu vektorisieren!
Ich habe versucht zu debuggen.
Ich habe versucht, die Sündenfunktion mit Chainer zu trainieren
Ich habe versucht, die in Python installierten Pakete grafisch darzustellen
Ich habe versucht, Iris aus dem Kamerabild zu erkennen
Ich habe versucht, eine CSV-Datei mit Python zu berühren
Ich habe versucht, das Spiel in der J League vorherzusagen (Datenanalyse)
Ich habe versucht, Soma Cube mit Python zu lösen
Ich habe versucht, die Sündenfunktion mit Chainer zu approximieren
[Python] Ich habe versucht, die Top 10 der Lidschatten grafisch darzustellen
Ich habe versucht, die Spacha-Informationen von VTuber zu visualisieren
Ich habe versucht, den negativen Teil von Meros zu löschen
Ich habe versucht, das Problem mit Python Vol.1 zu lösen
Ich habe versucht, die Methode zur Mittelung der Dollarkosten zu simulieren
Ich habe versucht, die nicht negative Matrixfaktorisierung (NMF) zu wiederholen.
Ich habe versucht, die Sprache mit CNN + Melspectogram zu identifizieren
Ich habe versucht, das Wissensdiagramm mit OpenKE zu ergänzen
Ich habe versucht, die Stimmen der Sprecher zu klassifizieren
Ich habe versucht, das Bild mithilfe von maschinellem Lernen zu komprimieren
Ich habe versucht, die String-Operationen von Python zusammenzufassen
Ich habe versucht, HULFT IoT (Agent) in das Gateway Rooster von Sun Electronics zu integrieren
[Nichtkorrelationstest] Ich habe versucht, die Grenzlinie mit oder ohne Ablehnung zu löschen
Ich habe versucht, PredNet zu lernen
Ich habe versucht, PCANet zu implementieren
Ich habe die Changefinder-Bibliothek ausprobiert!
Ich habe versucht, Linux wieder einzuführen
Ich habe versucht, Pylint vorzustellen
Ich habe versucht, SparseMatrix zusammenzufassen
jupyter ich habe es berührt
Ich habe versucht, StarGAN (1) zu implementieren.
Ich habe versucht, die Entropie des Bildes mit Python zu finden
Ich habe versucht, die Umrisse von Big Gorilla herauszufinden
Ich habe versucht, das Blockdiagramm-Generierungswerkzeug blockdiag einzuführen
[Pferderennen] Ich habe versucht, die Stärke des Rennpferdes zu quantifizieren
Ich habe versucht zu simulieren, wie sich die Infektion mit Python ausbreitet
Ich habe versucht, die Emotionen des gesamten Romans "Wetterkind" zu analysieren
[Erste COTOHA-API] Ich habe versucht, die alte Geschichte zusammenzufassen
Ich habe versucht, mit TensorFlow den Durchschnitt mehrerer Spalten zu ermitteln
Ich habe versucht, die Zugverspätungsinformationen mit LINE Notify zu benachrichtigen