trouver un expert Python
Cet article contient plusieurs exemples et couvre les montages, la découverte de tests, les assertions, les options en cours d'exécution et l'exécution d'unittests et de doctests.
Le slogan de Nose est «le nez s’allonge pour faciliter le test».
C’est un framework de test unitaire python assez bien connu, qui peut exécuter des tests de type test, test unittest et test «pas de passe-partout».
C'est un bon candidat pour un framework de test Go-to.
Je pense qu'un développeur intelligent devrait maîtriser le doctest, le unittest, le pytest et le nez. Ensuite, décidez si l’un de ceux-ci est le plus logique pour eux, ou s'ils souhaitent continuer à rechercher des fonctionnalités que l’on ne trouve que dans d’autres frameworks.
C’est bien sûr la raison pour laquelle j’écris cette série. Donc, je suppose que ce dernier point va sans dire.
Contenu
Pas de passe-partout, quelques api
Un fichier de test de base pour nose est assez simple, sans code passe-partout, sans classes obligatoires, sans importations inutiles et sans aucune API supplémentaire.
de nécessité_math importer multiplier
def test_numbers_3_4 ():
affirmer multiplier (3,4) == 12
de inut_math importation multiplier def test_numbers_3_4(): affirmer multiplier(3,4) == 12 |
Ceci est identique au test simple présenté dans mon intro pytest.
Il existe des différences entre la manière dont vous devez écrire vos tests pour les deux frameworks une fois que vous avez intégré des fonctionnalités supplémentaires, telles que les fixtures, les plugins, les mécanismes d'assertion, etc.
Je vais laisser une comparaison complète du pytest et du nez à un futur post.
Pourquoi est-ce que je dis «quelque api»? Eh bien, lorsque vous arrivez dans les installations (comme l'installation / le démontage, etc.), il y a une api de nez qui est nécessaire dans les tests. Je vais entrer dans cela dans la section des appareils.
Exemple de nez
Pour être complet en suivant les styles des précédentes introductions du framework, voici le test de base complet.
Cela ne diffère de ce qui précède que j’ai ajouté une autre fonction de test.
de nécessité_math importer multiplier
def test_numbers_3_4 ():
affirmer multiplier (3,4) == 12
def test_strings_a_3 ():
affirmer multiplier ('a', 3) == 'aaa'
de inut_math importation multiplier def test_numbers_3_4(): affirmer multiplier(3,4) == 12 def test_strings_a_3(): affirmer multiplier('une',3) == 'aaa' |
Nez qui coule
Pour courir le nez, utilisez le nosetests commande qui vient avec le nez.
nosetests test_um_nose.py
nosetests test_um_nose.py |
Et avec verbeux:
nosetests -v test_um_nose.py
nosetests –v test_um_nose.py |
Voici un exemple exécuté avec et sans verbose:
> nosetests test_um_nose.py
..
————————————————– ——————–
A couru 2 tests en 0.000s
D'accord
> nosetests -v test_um_nose.py
simple_example.test_um_nose.test_numbers_3_4 … ok
simple_exemple.test_um_nose.test_strings_a_3 … ok
————————————————– ——————–
A couru 2 tests en 0.000s
D'accord
> nosetests test_um_nose.py .. ––––––––––––––––––––––––––––––––––– A couru 2 tests dans 0.000s D'accord > nosetests –v test_um_nose.py exemple simple.test_um_nose.test_numbers_3_4 ... D'accord exemple simple.test_um_nose.test_strings_a_3 ... D'accord ––––––––––––––––––––––––––––––––––– A couru 2 tests dans 0.000s D'accord |
Fixations de nez
Nose étend le modèle de montage le plus simple d'installation / de démontage.
Nous pouvons ajouter du code spécifique pour exécuter:
- au début et à la fin d'un module de code de test (setup_module / teardown_module)
Pour que cela fonctionne, il vous suffit d'utiliser les bonnes règles de nommage. -
au début et à la fin d'une classe de méthodes de test (setup_class / teardown_class)
Pour que cela fonctionne, vous devez utiliser les bonnes règles de nommage et inclure le décorateur ‘@classmethod’. -
avant et après un appel de fonction test (setup_function / teardown_function)
Vous pouvez utiliser n'importe quel nom. Vous devez les appliquer avec le décorateur ‘@with_setup’ importé du nez.
Vous pouvez également utiliser l'affectation directe, ce que je vais montrer dans l'exemple. -
avant et après un appel de méthode de test (configuration / démontage)
Pour que cela fonctionne, vous devez utiliser le bon nom.
Les appareils les plus faciles à ajouter sont:
- setup_module () fonction: s'exécute avant tout le reste du fichier
- teardown_module () fonction: s'exécute après tout le reste du fichier
Et si vous utilisez une classe pour définir des tests:
- installer() méthode: s'exécute avant chaque méthode de test
- abattre() méthode: fonctionne après chaque méthode de test
Vous pouvez également définir des fonctions de test non basées sur la classe pour que le paramétrage / démontage
fonctions, mais vous devez importer le décorateur ‘with_setup’ du nez, comme suit:
from nose import with_setup # optionnel
def my_setup_function ():
passer
def my_teardown_function ():
passer
@with_setup (my_setup_function, my_teardown_function)
def test_numbers_3_4 ():
affirmer multiplier (3,4) == 12
def ma_setup_function(): passer def ma_teardown_function(): passer @avec_setup(ma_setup_function, ma_teardown_function) def test_numbers_3_4(): affirmer multiplier(3,4) == 12 |
Si vous n'aimez pas utiliser les décorateurs, vous pouvez également attribuer les attributs de configuration et de démontage comme suit:
test_numbers_3_4.setup = my_setup_function
test_numbers_3_4.teardown = ma_teardown_function
test_numbers_3_4.installer = ma_setup_function test_numbers_3_4.abattre = my_teardown_une fonction |
Cependant, je pense que c’est un peu gênant.
Avec les classes, vous pouvez définir une configuration / un démontage pour la classe, mais vous le faites différemment.
Vous devez vous assurer que les méthodes sont des méthodes de classe utilisant le décorateur ‘classmethod’, et nommez-les correctement, comme suit:
classe TestUM:
@classmethod
def setup_class (cls):
print ("setup_class () avant toute méthode de cette classe")
@classmethod
def teardown_class (cls):
print ("teardown_class () après toutes les méthodes de cette classe")
classe TestUM: @méthode de classe def setup_class(cls): impression ("setup_class () avant toutes les méthodes de cette classe") @méthode de classe def teardown_class(cls): impression ("teardown_class () après toutes les méthodes de cette classe") |
Cela fonctionne, c’est juste que vous devez garder la syntaxe exacte pour toutes les règles différentes pour différents appareils.
Ici, ils sont tous ensemble.
from nose import with_setup # optionnel
de nécessité_math importer multiplier
def setup_module (module):
print ("") # c'est pour obtenir une nouvelle ligne après les points
print ("setup_module avant quoi que ce soit dans ce fichier")
def teardown_module (module):
print ("teardown_module après tout dans ce fichier")
def my_setup_function ():
print ("my_setup_function")
def my_teardown_function ():
print ("my_teardown_function")
@with_setup (my_setup_function, my_teardown_function)
def test_numbers_3_4 ():
print 'test_numbers_3_4 <============================= Code de test réel'
affirmer multiplier (3,4) == 12
@with_setup (my_setup_function, my_teardown_function)
def test_strings_a_3 ():
print 'test_strings_a_3 <============================= Code de test réel'
affirmer multiplier ('a', 3) == 'aaa'
classe TestUM:
def setup (auto):
print ("TestUM: setup () avant chaque méthode de test")
def démontage (auto):
print ("TestUM: teardown () après chaque méthode de test")
@classmethod
def setup_class (cls):
print ("setup_class () avant toute méthode de cette classe")
@classmethod
def teardown_class (cls):
print ("teardown_class () après toutes les méthodes de cette classe")
def test_numbers_5_6 (auto):
print 'test_numbers_5_6 () <============================= Le code de test réel'
affirmer multiplier (5,6) == 30
def test_strings_b_2 (auto):
print 'test_strings_b_2 () <============================= Le code de test réel'
affirmer multiplier ('b', 2) == 'bb'
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
de nez importation avec_setup # optionnel de inut_math importation multiplier def setup_module(module): impression ("") # c'est pour obtenir une nouvelle ligne après les points impression ("setup_module avant quoi que ce soit dans ce fichier") def teardown_module(module): impression ("teardown_module après tout dans ce fichier") def ma_setup_function(): impression ("my_setup_function") def ma_teardown_function(): impression ("my_teardown_function") @avec_setup(ma_setup_function, ma_teardown_function) def test_numbers_3_4(): impression 'test_numbers_3_4 <============================= Code de test réel' affirmer multiplier(3,4) == 12 @avec_setup(ma_setup_function, ma_teardown_function) def test_strings_a_3(): impression 'test_strings_a_3 <============================= Code de test réel' affirmer multiplier('une',3) == 'aaa' classe TestUM: def installer(soi): impression ("TestUM: setup () avant chaque méthode de test") def abattre(soi): impression ("TestUM: démontage () après chaque méthode de test") @méthode de classe def setup_class(cls): impression ("setup_class () avant toutes les méthodes de cette classe") @méthode de classe def teardown_class(cls): impression ("teardown_class () après toutes les méthodes de cette classe") def test_numbers_5_6(soi): impression 'test_numbers_5_6 () <============================= Code de test réel' affirmer multiplier(5,6) == 30 def test_strings_b_2(soi): impression 'test_strings_b_2 () <============================= Code de test réel' affirmer multiplier('b',2) == 'bb' |
Pour le voir en action, je vais utiliser le -s option, qui désactive la capture de sortie.
Cela montrera l'ordre des différents appels de fixture.
> nosetests -s test_um_nose_fixtures.py
….
setup_module avant quoi que ce soit dans ce fichier
setup_class () avant toutes les méthodes de cette classe
TestUM: setup () avant chaque méthode de test
test_numbers_5_6 () <============================= Code de test réel
TestUM: démontage () après chaque méthode de test
TestUM: setup () avant chaque méthode de test
test_strings_b_2 () <============================= Code de test réel
TestUM: démontage () après chaque méthode de test
teardown_class () après toutes les méthodes de cette classe
ma_setup_function
test_numbers_3_4 <============================= Code de test réel
ma_teardown_function
ma_setup_function
test_strings_a_3 <============================= Code de test réel
ma_teardown_function
teardown_module après tout dans ce fichier
————————————————– ——————–
A couru 4 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 |
> nosetests –s test_um_nose_fixtures.py .... setup_module avant n'importe quoi dans ce fichier setup_class() avant tout les méthodes dans ce classe TestUM:installer() avant chaque tester méthode test_numbers_5_6() <============================ réel tester code TestUM:abattre() après chaque tester méthode TestUM:installer() avant chaque tester méthode test_strings_b_2() <============================ réel tester code TestUM:abattre() après chaque tester méthode teardown_class() après tout les méthodes dans ce classe ma_setup_function test_numbers_3_4 <============================ réel tester code ma_teardown_function ma_setup_function test_strings_a_3 <============================ réel tester code ma_teardown_function teardown_module après tout dans ce fichier ––––––––––––––––––––––––––––––––––– A couru 4 tests dans 0.001s D'accord |
Test de markdown.py
Ceci est également identique au code pouvant être exécuté à partir de py.test.
C’est similaire au code unittest, mais sans passe-partout, et avec de simples appels d’assertion au lieu d’assertEquals.
Encore une fois, j’utilise l’adaptateur d’API pour appeler proprement la fonctionnalité de démarquage.
Voici le code pour utiliser nose pour tester markdown.py:
depuis markdown_adapter import run_markdown
def test_non_marked_lines ():
print ('dans test_non_marked_lines')
assert run_markdown ('cette ligne n'a pas de traitement spécial')
== 'cette ligne n'a pas de traitement spécial
'
def test_em ():
print ('in test_em')
assert run_markdown ('* cela devrait être encapsulé dans les balises em *')
== '
cela devrait être enveloppé dans les balises em
'
def test_strong ():
print ('in test_strong')
assert run_markdown ('** ceci devrait être entouré de balises fortes **')
== '
cela devrait être enveloppé dans des étiquettes fortes
'
1 2 3 4 5 6 7 8 9 dix 11 12 13 14 15 16 17 18 |
de markdown_adapter importation run_markdown def test_non_marked_lines(): impression ('dans test_non_marked_lines') affirmer run_markdown("cette ligne n'a pas de traitement spécial") == 'cette ligne n'a pas de traitement spécial ' def test_em(): impression ('in test_em') affirmer run_markdown('* ceci devrait être enveloppé dans les balises em *') == ' cela devrait être enveloppé dans les balises em ' def test_strong(): impression ('dans test_strong') affirmer run_markdown("** ceci devrait être enveloppé dans des étiquettes fortes **") == ' cela devrait être enveloppé dans des étiquettes fortes ' |
Et voici la sortie:
> nosetests test_markdown_nose.py
FFF
=============================================== =====================
FAIL: test_markdown_nose.test_non_marked_lines
————————————————– ——————–
Traceback (dernier appel le plus récent):
Fichier "C: python27 lib site-packages nose-1.2.1-py2.7.egg nose case.py", ligne 197, dans runTest
auto.test (* self.arg)
Fichier "E: python_notes repo markdown.py-dev test_markdown_nose.py", ligne 13, dans test_non_marked_lines
== 'cette ligne n'a pas de traitement spécial
'
AssertionError:
——————– >> commencer à capturé stdout << ---------------------
in test_non_marked_lines
--------------------- >> fin de la capture stdout << ———————-
=============================================== =====================
FAIL: test_markdown_nose.test_em
————————————————– ——————–
Traceback (dernier appel le plus récent):
Fichier "C: python27 lib site-packages nose-1.2.1-py2.7.egg nose case.py", ligne 197, dans runTest
auto.test (* self.arg)
Fichier "E: python_notes repo markdown.py-dev test_markdown_nose.py", ligne 18, dans test_em
== '
cela devrait être enveloppé dans les balises em
'
AssertionError:
——————– >> commencer à capturé stdout << ---------------------
in test_em
--------------------- >> fin de la capture stdout << ———————-
=============================================== =====================
FAIL: test_markdown_nose.test_strong
————————————————– ——————–
Traceback (dernier appel le plus récent):
Fichier "C: python27 lib site-packages nose-1.2.1-py2.7.egg nose case.py", ligne 197, dans runTest
auto.test (* self.arg)
Fichier "E: python_notes repo markdown.py-dev test_markdown_nose.py", ligne 23, dans test_strong
== '
cela devrait être enveloppé dans des étiquettes fortes
'
AssertionError:
——————– >> commencer à capturé stdout << ---------------------
in test_strong
--------------------- >> fin de la capture stdout << ———————-
————————————————– ——————–
A couru 3 tests en 0.137s
FAILED (échecs = 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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
> nosetests test_markdown_nose.py FFF ====================================================================== ÉCHOUER: test_markdown_nose.test_non_marked_lines ––––––––––––––––––––––––––––––––––– Traceback (plus récent appel dernier): Fichier "C: python27 lib site-packages nose-1.2.1-py2.7.egg nose case.py", ligne 197, dans runTest soi.tester(*soi.se disputer) Fichier "E: python_notes repo markdown.py-dev test_markdown_nose.py", ligne 13, dans test_non_marked_lines == 'cette ligne n'a pas de traitement spécial ' AssertionError: –––––––––– >> commencer capturé stdout << ––––––––––– dans test_non_marked_lines ––––––––––– >> fin capturé stdout << ––––––––––– ====================================================================== ÉCHOUER: test_markdown_nose.test_em ––––––––––––––––––––––––––––––––––– Traceback (plus récent appel dernier): Fichier "C: python27 lib site-packages nose-1.2.1-py2.7.egg nose case.py", ligne 197, dans runTest soi.tester(*soi.se disputer) Fichier "E: python_notes repo markdown.py-dev test_markdown_nose.py", ligne 18, dans test_em == ' cela devrait être enveloppé dans les balises em ' AssertionError: –––––––––– >> commencer capturé stdout << ––––––––––– dans test_em ––––––––––– >> fin capturé stdout << ––––––––––– ====================================================================== ÉCHOUER: test_markdown_nose.test_strong ––––––––––––––––––––––––––––––––––– Traceback (plus récent appel dernier): Fichier "C: python27 lib site-packages nose-1.2.1-py2.7.egg nose case.py", ligne 197, dans runTest soi.tester(*soi.se disputer) Fichier "E: python_notes repo markdown.py-dev test_markdown_nose.py", ligne 23, dans test_strong == ' cela devrait être enveloppé dans des étiquettes fortes ' AssertionError: –––––––––– >> commencer capturé stdout << ––––––––––– dans test_strong ––––––––––– >> fin capturé stdout << ––––––––––– ––––––––––––––––––––––––––––––––––– A couru 3 tests dans 0.137s ÉCHOUÉ (les échecs=3) |
Tous les tests échouent.
Bien que les numéros de ligne des échecs, ainsi que les noms des fonctions de test, soient imprimés, le rapport n’indique pas vraiment ce qui ne va pas.
Nez assert_equals
Si nous utilisons beaucoup de affirmer quelque chose == quelque choseElse tests de type, et nous nous sommes engagés à utiliser le nez pour les tests, nous pouvons utiliser des outils de nez pour rendre le rapport un peu évident sur la nature de l’échec.
Je vais réécrire les tests ci-dessus en utilisant nose.tools.assert_equals:
from nose.tools import assert_equals
depuis markdown_adapter import run_markdown
def test_non_marked_lines ():
print ('dans test_non_marked_lines')
assert_equals (run_markdown ('cette ligne n'a pas de traitement spécial'),
'cette ligne n'a pas de traitement spécial
')
def test_em ():
print ('in test_em')
assert_equals (run_markdown ('* cela devrait être encapsulé dans les balises em *'),
'
cela devrait être enveloppé dans les balises em
')
def test_strong ():
print ('in test_strong')
assert_equals (run_markdown ('** ceci devrait être entouré de balises fortes **'),
'
cela devrait être enveloppé dans des étiquettes fortes
')
1 2 3 4 5 6 7 8 9 dix 11 12 13 14 15 16 17 18 19 |
de nez.outils importation assert_equals de markdown_adapter importation run_markdown def test_non_marked_lines(): impression ('dans test_non_marked_lines') assert_equals(run_markdown("cette ligne n'a pas de traitement spécial"), 'cette ligne n'a pas de traitement spécial ') def test_em(): impression ('in test_em') assert_equals( run_markdown('* ceci devrait être enveloppé dans les balises em *'), ' cela devrait être enveloppé dans les balises em ') def test_strong(): impression ('dans test_strong') assert_equals( run_markdown("** ceci devrait être enveloppé dans des étiquettes fortes **"), ' cela devrait être enveloppé dans des étiquettes fortes ') |
Nose’s assert_equals fonctionne beaucoup comme assertEquals de unittest.
Regardons maintenant le résultat:
> nosetests test_markdown_nose_assert_equals.py
FFF
=============================================== =====================
FAIL: test_markdown_nose_assert_equals.test_non_marked_lines
————————————————– ——————–
Traceback (dernier appel le plus récent):
Fichier "C: python27 lib site-packages nose-1.2.1-py2.7.egg nose case.py", ligne 197, dans runTest
auto.test (* self.arg)
Fichier "E: python_notes repo markdown.py-dev test_markdown_nose_assert_equals.py", ligne 14, dans test_non_marked_lines
'cette ligne n'a pas de traitement spécial
')
AssertionError: 'cette ligne n'a pas de traitement spécial'! = '
cette ligne n'a pas de traitement spécial
'
——————– >> commencer à capturé stdout << ---------------------
in test_non_marked_lines
--------------------- >> fin de la capture stdout << ———————-
=============================================== =====================
FAIL: test_markdown_nose_assert_equals.test_em
————————————————– ——————–
Traceback (dernier appel le plus récent):
Fichier "C: python27 lib site-packages nose-1.2.1-py2.7.egg nose case.py", ligne 197, dans runTest
auto.test (* self.arg)
Fichier "E: python_notes repo markdown.py-dev test_markdown_nose_assert_equals.py", ligne 19, dans test_em
'
cela devrait être enveloppé dans les balises em
')
AssertionError: '* cela devrait être encapsulé dans les balises em *'! = '
cela devrait être enveloppé dans les balises em
'
——————– >> commencer à capturé stdout << ---------------------
in test_em
--------------------- >> fin de la capture stdout << ———————-
=============================================== =====================
FAIL: test_markdown_nose_assert_equals.test_strong
————————————————– ——————–
Traceback (dernier appel le plus récent):
Fichier "C: python27 lib site-packages nose-1.2.1-py2.7.egg nose case.py", ligne 197, dans runTest
auto.test (* self.arg)
Fichier "E: python_notes repo markdown.py-dev test_markdown_nose_assert_equals.py", ligne 24, dans test_strong
'
cela devrait être enveloppé dans des étiquettes fortes
')
AssertionError: '** ceci devrait être enveloppé dans des balises fortes **'! = '
cela devrait être enveloppé dans des étiquettes fortes
'
——————– >> commencer à capturé stdout << ---------------------
in test_strong
--------------------- >> fin de la capture stdout << ———————-
————————————————– ——————–
A couru 3 tests en 0.139s
FAILED (échecs = 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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
> nosetests test_markdown_nose_assert_equals.py FFF ====================================================================== ÉCHOUER: test_markdown_nose_assert_equals.test_non_marked_lines ––––––––––––––––––––––––––––––––––– Traceback (plus récent appel dernier): Fichier "C: python27 lib site-packages nose-1.2.1-py2.7.egg nose case.py", ligne 197, dans runTest soi.tester(*soi.se disputer) Fichier "E: python_notes repo markdown.py-dev test_markdown_nose_assert_equals.py", ligne 14, dans test_non_marked_lignes 'cette ligne n'a pas de traitement spécial ') AssertionError: "cette ligne n'a pas de traitement spécial" ! = ' cette ligne n'a pas de traitement spécial ' –––––––––– >> commencer capturé stdout << ––––––––––– dans test_non_marked_lines ––––––––––– >> fin capturé stdout << ––––––––––– ====================================================================== ÉCHOUER: test_markdown_nose_assert_equals.test_em ––––––––––––––––––––––––––––––––––– Traceback (plus récent appel dernier): Fichier "C: python27 lib site-packages nose-1.2.1-py2.7.egg nose case.py", ligne 197, dans runTest soi.tester(*soi.se disputer) Fichier "E: python_notes repo markdown.py-dev test_markdown_nose_assert_equals.py", ligne 19, dans tester_em ' cela devrait être enveloppé dans les balises em ') AssertionError: '* ceci devrait être enveloppé dans les balises em *' ! = ' cela devrait être enveloppé dans les balises em ' –––––––––– >> commencer capturé stdout << ––––––––––– dans test_em ––––––––––– >> fin capturé stdout << ––––––––––– ====================================================================== ÉCHOUER: test_markdown_nose_assert_equals.test_strong ––––––––––––––––––––––––––––––––––– Traceback (plus récent appel dernier): Fichier "C: python27 lib site-packages nose-1.2.1-py2.7.egg nose case.py", ligne 197, dans runTest soi.tester(*soi.se disputer) Fichier "E: python_notes repo markdown.py-dev test_markdown_nose_assert_equals.py", ligne 24, dans tester_fort ' cela devrait être enveloppé dans des étiquettes fortes ') AssertionError: "** ceci devrait être enveloppé dans des étiquettes fortes **" ! = ' cela devrait être enveloppé dans des étiquettes fortes ' –––––––––– >> commencer capturé stdout << ––––––––––– dans test_strong ––––––––––– >> fin capturé stdout << ––––––––––– ––––––––––––––––––––––––––––––––––– A couru 3 tests dans 0.139s ÉCHOUÉ (les échecs=3) |
Maintenant, la sortie rend plus évident ce qui ne va pas.
Test de découverte
J'utilise les mêmes conventions d'appellation pour le nez que pour py.test.
- Nommez mes modules / fichiers de test en commençant par «test_».
- Nommez mes fonctions de test en commençant par «test_».
- Nommez mes classes de test en commençant par 'Test'.
- Nommez mes méthodes de test en commençant par 'test_'.
- Assurez-vous que tous les paquets avec le code de test ont un ‘initfichier .py ’.
Ces règles fonctionnent très bien pour moi.
Ce n'est pas la liste complète des règles. Si vous voulez faire quelque chose de différent, consultez la documentation du nez pour trouver des tests.
Courir unittest du nez
Nose trouve et exécute des tests sans aucun problème et sans étapes supplémentaires.
Ici, je vais lancer les tests depuis l’intro unittest:
> nosetests test_um_unittest.py
..
————————————————– ——————–
A couru 2 tests en 0.000s
D'accord
> nosetests -v test_um_unittest.py
test_numbers_3_4 (simple_exemple.test_um_unittest.TestUM) … ok
test_strings_a_3 (simple_example.test_um_unittest.TestUM) … ok
————————————————– ——————–
A couru 2 tests en 0.001s
D'accord
> nosetests test_um_unittest.py .. ––––––––––––––––––––––––––––––––––– A couru 2 tests dans 0.000s D'accord > nosetests –v test_um_unittest.py test_numbers_3_4 (exemple simple.test_um_unittest.TestUM) ... D'accord test_strings_a_3 (exemple simple.test_um_unittest.TestUM) ... D'accord ––––––––––––––––––––––––––––––––––– A couru 2 tests dans 0.001s D'accord |
Traverser les docteurs du nez
Nose peut exécuter des doctests, soi-disant.
Cependant, je ne pouvais pas le faire fonctionner sur des doctests dans une méthode de fichier séparée, en utilisant test_unnecessary_math.txt.
J'ai essayé plusieurs des options, sans succès.
Si vous savez ce que je fais mal, s'il vous plaît faites le moi savoir.
Plus d'infos sur le nez (liens)
Exemples sur github
Tous les exemples ici sont disponibles dans le projet markdown.py sur github.
[ad_2]