Formation gratuite Python
- Comment créer une image d'arrière-plan Gutenberg (bloc de couverture) • WPShout
- Affirmation différée / échecs multiples par test
- Jouer et enregistrer du son en Python – Real Python
- Réservations de restaurant ReDi Easy via WordPress
- Peut-être qu'unittest est faux, et tearDown devrait toujours fonctionner
Je vais couvrir les montages d'installation et de démontage de nez au niveau du package, du module, de la classe, de la méthode et de la fonction.
Il ne s’agit pas de savoir quel code mettre dans les fixtures, mais juste de la syntaxe et du flux.
Et un peu sur les conventions de nommage.
Bien que j'ai parlé des rencontres dans l'introduction du nez, je pense que ce post fonctionnera mieux comme référence.
Contenu
Méthode vs fonction
Dans la discussion ci-dessous, je distingue une différence entre méthode et une fonction.
Je suis une convention de la documentation python:
Une méthode est une fonction qui “appartient” à un objet.
UNE méthode est une une fonction cette “fait parti à” un objet. |
En d’autres termes, si une fonction n’est PAS dans une classe, c’est un une fonction.
Si c’est dans une classe, c’est un méthode.
Appareils au niveau du paquet
Ajoutez les fonctions "setup_package ()" et "teardown_package ()" au "__init__.py" d’un paquet.
"Setup_package" sera exécuté avant tous les modules de test du paquet.
"Teardown_package" sera exécuté une fois que tous les modules auront été exécutés (si la configuration a réussi).
def setup_package ():
passer
def teardown_package ():
passer
def setup_package(): passer def teardown_package(): passer |
Appareils au niveau du module
Les fixtures de module supportent l'exécution de tout dans le module (classes de test et fonctions de test).
Ces fonctions ne fonctionnent qu'une fois chacune.
def setup_module ():
passer
def teardown_module ():
passer
def setup_module(): passer def teardown_module(): passer |
Appareils de niveau de classe
Les fixtures de classe encadrent l'exécution de tout dans une classe.
Ces fonctions ne fonctionnent qu'une fois chacune.
Classe TestClass ():
@classmethod
def setup_class (cls):
passer
@classmethod
def teardown_class (cls):
passer
classe TestClass(): @méthode de classe def setup_class(cls): passer @méthode de classe def teardown_class(cls): passer |
Appareils de niveau méthode méthode
Les fixtures de méthode de classe encadrent l'exécution de chacune des méthodes de test de la classe.
Ces fonctions s'exécutent plusieurs fois, une fois pour chaque méthode de test.
Classe TestClass ():
def setup (auto):
passer
def démontage (auto):
passer
classe TestClass(): def installer(soi): passer def abattre(soi): passer |
Appareils de niveau de fonction
Les montages au niveau fonctionnel sont l’essentiel du peloton.
Nose ne détecte aucune convention de dénomination pour cela.
Tout est fait avec le décorateur ‘@with_setup’, qui doit être inclus à partir de ‘nez.tools’.
depuis nose.tools import with_setup
def setup_function ():
passer
def teardown_function ():
passer
@with_setup (setup_function, teardown_function)
def test_something ():
passer
de nez.outils importation avec_setup def setup_function(): passer def teardown_function(): passer @avec_setup(setup_function, teardown_function) def test_quelque chose(): passer |
Cela vous permet d’avoir différents appareils pour différents tests.
def foo ():
passer
def bar ():
passer
@with_setup (foo, bar)
def test_something_else ():
passer
def foo(): passer def bar(): passer @avec_setup(foo, bar) def test_quelque chose_else(): passer |
Cependant, veuillez choisir des noms qui ont du sens.
Cela vous permet également d’oublier d’ajouter le décorateur, alors faites attention.
@with_setup (setup_function, teardown_function)
def test_a ():
passer
@with_setup (setup_function, teardown_function)
def test_b ():
passer
def test_c (): # Cela manque-t-il intentionnellement? ou quelqu'un a-t-il oublié?
passer
@avec_setup(setup_function, teardown_function) def test_a(): passer @avec_setup(setup_function, teardown_function) def test_b(): passer def test_c(): # Est-ce que cela manque exprès d'un appareil? ou quelqu'un a-t-il oublié? passer |
Exemple complet
__init__.py
depuis __future__ import print_function
def setup_package ():
impression('')
print (__ name__, '__init__.py: setup_package () ===================================== == ')
def teardown_package ():
print (__ name__, '__init__.py: teardown_package () ====================================' )
de __futur__ importation fonction_impression def setup_package(): impression('') impression(__prénom__, '__init__.py: setup_package () =======================================') def teardown_package(): impression(__prénom__, '__init__.py: teardown_package () =====================================') |
test_using_classes.py
depuis __future__ import print_function
def setup_module ():
print (__ name__, ': setup_module () ~~~~~~~~~~~~~~~~~~~~~~')
def teardown_module ():
print (__ name__, ': teardown_module () ~~~~~~~~~~~~~~~~~~~')
Classe TestClass ():
@classmethod
def setup_class (cls):
print (__ name__, ': TestClass.setup_class () ———-')
@classmethod
def teardown_class (cls):
print (__ name__, ': TestClass.teardown_class () ——-')
def setup (auto):
print (__ name__, ': TestClass.setup () – – – – – – – -')
def démontage (auto):
print (__ name__, ': TestClass.teardown () – – – – – – -')
def test_method_1 (auto):
print (__ name__, ': TestClass.test_method_1 ()')
def test_method_2 (auto):
print (__ name__, ': TestClass.test_method_2 ()')
1 2 3 4 5 6 7 8 9 dix 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
de __futur__ importation fonction_impression def setup_module(): impression(__prénom__, ': setup_module () ~~~~~~~~~~~~~~~~~~~~~~~') def teardown_module(): impression(__prénom__, ': teardown_module () ~~~~~~~~~~~~~~~~~~~~~') classe TestClass(): @méthode de classe def setup_class(cls): impression(__prénom__, ': TestClass.setup_class () ———-') @méthode de classe def teardown_class(cls): impression(__prénom__, ': TestClass.teardown_class () ——-') def installer(soi): impression(__prénom__, ': TestClass.setup () – – – – – – – – -') def abattre(soi): impression(__prénom__, ': TestClass.teardown () – – – – – – – -') def test_method_1(soi): impression(__prénom__, ': TestClass.test_method_1 ()') def test_method_2(soi): impression(__prénom__, ': TestClass.test_method_2 ()') |
test_using_functions.py
depuis __future__ import print_function
depuis nose.tools import with_setup
def setup_module ():
print (__ name__, ': setup_module () ~~~~~~~~~~~~~~~~~~~~~~')
def teardown_module ():
print (__ name__, ': teardown_module () ~~~~~~~~~~~~~~~~~~~')
def setup_function ():
"attaché avec 'with_setup'decorator"
print (__ name__, ': setup_function () – – – – – – – – -')
def teardown_function ():
"attaché avec 'with_setup'decorator"
print (__ name__, ': teardown_function () – – – – – – -')
def test_func_1 ():
print (__ name__, ': test_func_1 ()')
def test_func_2 ():
print (__ name__, ': test_func_2 ()')
@with_setup (setup_function, teardown_function)
def test_func_3 ():
print (__ name__, ': test_func_3 ()')
1 2 3 4 5 6 7 8 9 dix 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
de __futur__ importation fonction_impression de nez.outils importation avec_setup def setup_module(): impression(__prénom__, ': setup_module () ~~~~~~~~~~~~~~~~~~~~~~~') def teardown_module(): impression(__prénom__, ': teardown_module () ~~~~~~~~~~~~~~~~~~~~~') def setup_function(): "attaché avec 'with_setup'decorator" impression(__prénom__, ': setup_function () – – – – – – – – – -') def teardown_function(): "attaché avec 'with_setup'decorator" impression(__prénom__, ': teardown_function () – – – – – – – -') def test_func_1(): impression(__prénom__, ': test_func_1 ()') def test_func_2(): impression(__prénom__, ': test_func_2 ()') @avec_setup(setup_function, teardown_function) def test_func_3(): impression(__prénom__, ': test_func_3 ()') |
Flux de contrôle
Je mets les fichiers dans un testNoseFixtures
annuaire.
Lancer les tests avec -s
afin que je puisse voir la sortie, produit ce qui suit.
> nosetests -s testNosePackage
…..
testNosePackage __init__.py: setup_package () ======================================
testNosePackage.test_using_classes: setup_module () ~~~~~~~~~~~~~~~~~~~~~
testNosePackage.test_using_classes: TestClass.setup_class () ———-
testNosePackage.test_using_classes: TestClass.setup () – – – – – – – –
testNosePackage.test_using_classes: TestClass.test_method_1 ()
testNosePackage.test_using_classes: TestClass.teardown () – – – – – – –
testNosePackage.test_using_classes: TestClass.setup () – – – – – – – –
testNosePackage.test_using_classes: TestClass.test_method_2 ()
testNosePackage.test_using_classes: TestClass.teardown () – – – – – – –
testNosePackage.test_using_classes: TestClass.teardown_class () ——-
testNosePackage.test_using_classes: teardown_module () ~~~~~~~~~~~~~~~~~~~
testNosePackage.test_using_functions: setup_module () ~~~~~~~~~~~~~~~~~~~~~~
testNosePackage.test_using_functions: test_func_1 ()
testNosePackage.test_using_functions: test_func_2 ()
testNosePackage.test_using_functions: fonction_installation () – – – – – – – – –
testNosePackage.test_using_functions: test_func_3 ()
testNosePackage.test_using_functions: teardown_function () – – – – – – – –
testNosePackage.test_using_functions: teardown_module () ~~~~~~~~~~~~~~~~~~~
testNosePackage __init__.py: teardown_package () ====================================
————————————————– ——————–
A couru 5 tests en 0.001s
D'accord
1 2 3 4 5 6 7 8 9 dix 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
Etgt; nosetests –s testNosePackage ..... testNosePackage __init__.py : setup_package() ======================================== testNosePackage.test_using_classes : setup_module() ~~~~~~~~~~~~~~~~~~~~~~ testNosePackage.test_using_classes : TestClass.setup_class() ––––– testNosePackage.test_using_classes : TestClass.installer() – – – – – – – – testNosePackage.test_using_classes : TestClass.test_method_1() testNosePackage.test_using_classes : TestClass.abattre() – – – – – – – testNosePackage.test_using_classes : TestClass.installer() – – – – – – – – testNosePackage.test_using_classes : TestClass.test_method_2() testNosePackage.test_using_classes : TestClass.abattre() – – – – – – – testNosePackage.test_using_classes : TestClass.teardown_class() –––– testNosePackage.test_using_classes : teardown_module() ~~~~~~~~~~~~~~~~~~~ testNosePackage.test_using_functions : setup_module() ~~~~~~~~~~~~~~~~~~~~~~ testNosePackage.test_using_functions : test_func_1() testNosePackage.test_using_functions : test_func_2() testNosePackage.test_using_functions : setup_function() – – – – – – – – – testNosePackage.test_using_functions : test_func_3() testNosePackage.test_using_functions : teardown_function() – – – – – – – testNosePackage.test_using_functions : teardown_module() ~~~~~~~~~~~~~~~~~~~ testNosePackage __init__.py : teardown_package() ===================================== ––––––––––––––––––––––––––––––––––– A couru 5 tests dans 0.001s D'accord |
Noms alternatifs
Nose oublie assez les conventions de nommage pour les fixtures.
Je vais énumérer les noms alternatifs pour les différents appareils.
Cependant, je vous encourage fortement à utiliser les noms énumérés ci-dessus.
Les noms énumérés ci-dessus sont, à mon avis, les plus faciles à lire.
La seule exception est setup_function / teardown_function, puisque celles-ci sont éventuellement personnalisées pour chaque fonction de test, utilisez ce que vous voulez.
- setup_package
- setup, setUp ou setUpPackage
- teardown_package
- démantèlement, tearDown ou tearDownPackage
- setup_module
- setup, setUp ou setUpModule
- teardown_module
- démantèlement, tearDown ou tearDownModule
- setup_class
- setupClass, setUpClass, setupAll ou setUpAll
- teardown_class
- teardownClass, tearDownClass, teardownAll ou tearDownAll.
- setup (fixtures de méthodes de classe)
- installer
- démontage (fixtures de méthode de classe)
- abattre
- setup_function / teardown_function
- peut être nommé n'importe quoi, puisqu'il est attaché à une fonction avec '@with_setup'
[ad_2]