[PYTHON] J'ai essayé de mettre Pytest dans la bataille réelle

Fonctionnalité

C'est ce que signifie écrire conftest.py pour chaque répertoire.

tests
├── __init__.py
├── event
│   ├── __init__.py
|   |── conftest.py         #Code de configuration commun
│   ├── battle_event_1207
│   │   ├── __init__.py
│   │   ├── conftest.py     #Code de configuration d'événement à durée limitée
│   │   └── test_event.py
│   └── battle_event_1213
│       ├── __init__.py
│       ├── conftest.py     #Un autre
│       └── test_event.py
└── logics
    └── __init__.py

Comment vous l'utilisez

__Web Framework utilise Flask __

Partie inutilisée

Là où c'est impossible à moins de comprendre les spécifications de l'application et d'apprendre à utiliser le framework Web / le framework de test

_ Considérer s'il faut utiliser Web Test ou Test intégré de Flask _

échantillon

Code de configuration

Il semble bon d'importer ou d'initialiser la cible de test. Si vous créez un fichier avec le nom conftest.py, pytest le lira pour vous.

De plus, les fonctions commençant par pytest_ sont des fonctions spéciales et utilisent principalement pytest_funcarg__xxxx (request). Vous pouvez l'utiliser pour transmettre des objets qui dépendent de la fonction de test en tant qu'arguments. Du côté de la fonction de test, si vous spécifiez un argument avec le nom «xxxx», il y sera passé.

conftest.py


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

Traitement courant des modules utilisés dans le code de test
Création de cibles de test, etc.

"""

from datetime import datetime, timedelta


def pytest_report_header(config):
    """En-tête du rapport de test
    """
    return "battle_event_1213 essai"


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):
    """Usine décrite ici
    """
    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(Injection de dépendance)
Fonction de test/Dans l'argument de la méthode`mysetup`Spécifier
    """
    return MySetup()


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

Code de test

Vous pouvez utiliser le décorateur pytest.mark.skipif pour sauter le test lorsque la condition est vraie. Bien que ce soit une fonction qui a déjà été supprimée, il est possible de ne laisser que le cas de test pour le moment, ou de spécifier la date d'expiration et d'ignorer la fonction pendant un temps limité le moment venu. Du côté du code d'installation, l'objet renvoyé par la fonction pytest_funcarg__event (request) est passé à l'argument ʻevent. Puisque vous voulez tester l'état de l'objet à tester qui est fondamentalement configuré depuis le début, utiliser conftest.pyélimine le problème de configuration côté code de test. Comme dans cet exemple, vous pouvez utiliser le décorateurpytest.mark.parametrizepour passer l'entrée et les valeurs attendues afin d'éliminer les tracas liés à l'écriture répétée de fonctions / méthodes de test. Commepytest_funcarg__xxxx (request)`, il est passé à l'argument de la fonction de test.

test_event.py


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


#Période de validité du test
is_timeout_event = datetime.now() > datetime(2012,12,19,23,59)
check_event_period = pytest.mark.skipif('%s' % is_timeout_event)

#Paramètres de test
EXCEEDED_GAUGE = 140
MAX_GAUGE = 100
MAX_ATTACK_PT = 4


#Si vous mettez des caractères dans skipif, le test sera ignoré(J'ai supprimé la mauvaise fonction, donc j'ai sauté le test)
@pytest.mark.skipif('"La jauge utilise une bonne jauge, alors sautez ce 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


#Passer ce test à la fin de la période
@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()

Conclusion

Je ne peux pas retourner à unittest

référence

Recommended Posts

J'ai essayé de mettre Pytest dans la bataille réelle
J'ai essayé de déplacer le ballon
J'ai essayé d'estimer la section.
J'ai essayé de résumer la commande umask
J'ai essayé de reconnaître le mot de réveil
J'ai essayé de résumer la modélisation graphique.
J'ai essayé d'estimer le rapport de circonférence π de manière probabiliste
J'ai essayé de toucher l'API COTOHA
Touches de karaoké assorties ~ J'ai essayé de le mettre sur Laravel ~ <en route>
J'ai essayé Web Scraping pour analyser les paroles.
J'ai essayé d'optimiser le séchage du linge
J'ai essayé de sauvegarder les données avec discorde
J'ai essayé de corriger la forme trapézoïdale de l'image
Qiita Job J'ai essayé d'analyser le travail
LeetCode j'ai essayé de résumer les plus simples
J'ai essayé de mettre en œuvre le problème du voyageur de commerce
J'ai essayé de vectoriser les paroles de Hinatazaka 46!
J'ai essayé de déboguer.
J'ai essayé d'entraîner la fonction péché avec chainer
J'ai essayé de représenter graphiquement les packages installés en Python
J'ai essayé de détecter l'iris à partir de l'image de la caméra
J'ai essayé de toucher un fichier CSV avec Python
J'ai essayé de prédire le match de la J League (analyse des données)
J'ai essayé de résoudre Soma Cube avec python
J'ai essayé d'approcher la fonction sin en utilisant le chainer
[Python] J'ai essayé de représenter graphiquement le top 10 des ombres à paupières
J'ai essayé de visualiser les informations spacha de VTuber
J'ai essayé d'effacer la partie négative de Meros
J'ai essayé de résoudre le problème avec Python Vol.1
J'ai essayé de simuler la méthode de calcul de la moyenne des coûts en dollars
J'ai essayé de refaire la factorisation matricielle non négative (NMF)
J'ai essayé d'identifier la langue en utilisant CNN + Melspectogram
J'ai essayé de compléter le graphe de connaissances en utilisant OpenKE
J'ai essayé de classer les voix des acteurs de la voix
J'ai essayé de compresser l'image en utilisant l'apprentissage automatique
J'ai essayé de résumer les opérations de chaîne de Python
J'ai essayé de mettre HULFT IoT (Agent) dans la passerelle Rooster de Sun Electronics
[Test de décorrélation] J'ai essayé d'éteindre la ligne de démarcation avec ou sans rejet
J'ai essayé d'apprendre PredNet
J'ai essayé d'implémenter PCANet
J'ai essayé la bibliothèque changefinder!
J'ai essayé de réintroduire Linux
J'ai essayé de présenter Pylint
J'ai essayé de résumer SparseMatrix
jupyter je l'ai touché
J'ai essayé d'implémenter StarGAN (1)
J'ai essayé de trouver l'entropie de l'image avec python
J'ai essayé de découvrir les grandes lignes de Big Gorilla
J'ai essayé d'introduire l'outil de génération de diagramme blockdiag
[Courses de chevaux] J'ai essayé de quantifier la force du cheval de course
J'ai essayé de simuler la propagation de l'infection avec Python
J'ai essayé d'analyser les émotions de tout le roman "Weather Child" ☔️
[Première API COTOHA] J'ai essayé de résumer l'ancienne histoire
J'ai essayé de trouver la moyenne de plusieurs colonnes avec TensorFlow
J'ai essayé de notifier les informations de retard de train avec LINE Notify