Tutoriel PyTest : Qu'est-ce que c'est, comment installer, framework, assertions

Quโ€™est-ce que PyTest ?

PyTest est un framework de test qui permet aux utilisateurs d'รฉcrire des codes de test en utilisant Python Langage de programmation. Il vous aide ร  รฉcrire des cas de test simples et รฉvolutifs pour les bases de donnรฉes, les API ou l'interface utilisateur. PyTest est principalement utilisรฉ pour รฉcrire des tests pour les API. Il permet d'รฉcrire des tests allant des tests unitaires simples aux tests fonctionnels complexes.

Pourquoi utiliser PyTest ?

Certains des avantages de pytest sont

  • Trรจs facile ร  dรฉmarrer grรขce ร  sa syntaxe simple et facile.
  • Peut exรฉcuter des tests en parallรจle.
  • Peut exรฉcuter un test spรฉcifique ou un sous-ensemble de tests
  • Dรฉtecter automatiquement les tests
  • Passer les tests
  • Open source

Comment installer PyTest

Voici un processus pour installer PyTest :

ร‰tape 1) Vous pouvez installer pytest en

pip install pytest==2.9.1

Une fois l'installation terminรฉe, vous pouvez la confirmer avec par

py.test -h

Cela affichera l'aide

installer PyTest

Premier PyTest de base

Nous allons maintenant apprendre ร  utiliser Pytest avec un exemple de base de PyTest.

Crรฉez un dossier study_pytest. Nous allons crรฉer nos fichiers de test dans ce dossier.

Veuillez accรฉder ร  ce dossier dans votre ligne de commande.

Crรฉez un fichier nommรฉ test_sample1.py dans le dossier

Premier PyTest de base

Ajoutez-y le code ci-dessous et enregistrez

import pytest
def test_file1_method1():
	x=5
	y=6
	assert x+1 == y,"test failed"
	assert x == y,"test failed"
def test_file1_method2():
	x=5
	y=6
	assert x+1 == y,"test failed" 

Exรฉcutez le test ร  l'aide de la commande

py.test

Vous obtiendrez une sortie sous la forme

test_sample1.py F.
============================================== FAILURES ========================================
____________________________________________ test_sample1 ______________________________________
    def test_file1_method1():
    	x=5
    	y=6
       	assert x+1 == y,"test failed"
>      	assert x == y,"test failed"
E       AssertionError: test failed
E       assert 5 == 6
test_sample1.py:6: AssertionError

Premier PyTest de base

Ici dans test_sample1.py F.

F dit รฉchec

Dot(.) indique le succรจs.

Dans la section des รฉchecs, vous pouvez voir la ou les mรฉthodes ayant รฉchouรฉ et la ligne d'รฉchec. Ici, x==y signifie 5==6, ce qui est faux.

Ensuite, dans ce didacticiel PyTest, nous dรฉcouvrirons l'assertion dans PyTest.

Assertions dans PyTest

Les assertions Pytest sont des vรฉrifications qui renvoient le statut True ou False. Dans Python Pytest, si une assertion รฉchoue dans une mรฉthode de test, alors l'exรฉcution de cette mรฉthode y est arrรชtรฉe. Le code restant dans cette mรฉthode de test n'est pas exรฉcutรฉ et les assertions Pytest continueront avec la mรฉthode de test suivante.

Exemples d'assertions Pytest :

assert "hello" == "Hai" is an assertion failure.
assert 4==4 is a successful assertion
assert True is a successful assertion
assert False is an assertion failure.

Considรฉrer

assert x == y,"test failed because x=" + str(x) + " y=" + str(y)

Placez ce code dans test_file1_method1() au lieu de l'assertion

assert x == y,"test failed"

L'exรฉcution du test donnera l'รฉchec comme AssertionError : le test a รฉchouรฉ x=5 y=6

Comment PyTest identifie les fichiers de test et les mรฉthodes de test

Par dรฉfaut, pytest identifie uniquement les noms de fichiers commenรงant par tester_ ou se terminant par _tester comme les fichiers de test. Nous pouvons cependant mentionner explicitement d'autres noms de fichiers (expliquรฉs plus tard). Pytest nรฉcessite que les noms des mรฉthodes de test commencent par "test.ยป Tous les autres noms de mรฉthodes seront ignorรฉs mรชme si nous demandons explicitement d'exรฉcuter ces mรฉthodes.

Voir quelques exemples de noms de fichiers pytest valides et invalides

test_login.py - valid
login_test.py - valid
testlogin.py -invalid
logintest.py -invalid

Remarque : Oui, nous pouvons demander explicitement ร  pytest de choisir testlogin.py et logintest.py

Voir quelques exemples de mรฉthodes de test pytest valides et invalides

def test_file1_method1(): - valid
def testfile1_method1(): - valid
def file1_method1(): - invalid	

Remarque : Mรชme si nous mentionnons explicitement file1_method1(), pytest n'exรฉcutera pas cette mรฉthode.

Exรฉcuter plusieurs tests ร  partir d'un fichier spรฉcifique et de plusieurs fichiers

Actuellement, dans le dossier study_pytest, nous avons un fichier test_sample1.py. Supposons que nous ayons plusieurs fichiers, disons test_sample2.py, test_sample3.py. Pour exรฉcuter tous les tests de tous les fichiers du dossier et des sous-dossiers, nous devons simplement exรฉcuter la commande pytest.

py.test

Cela exรฉcutera tous les noms de fichiers commenรงant par test_ et les noms de fichiers se terminant par _test dans ce dossier et les sous-dossiers de ce dossier.

Pour exรฉcuter des tests uniquement ร  partir d'un fichier spรฉcifique, nous pouvons utiliser py.test

py.test test_sample1.py

Exรฉcutez un sous-ensemble de test complet avec PyTest

Parfois, nous ne souhaitons pas exรฉcuter lโ€™intรฉgralitรฉ de la suite de tests. Pytest nous permet d'exรฉcuter des tests spรฉcifiques. Nous pouvons le faire de 2 maniรจres

  • Regroupement des noms de tests par correspondance de sous-chaรฎne
  • Regroupement des tests par marqueurs

Nous avons dรฉjร  test_sample1.py. Crรฉez un fichier test_sample2.py et ajoutez-y le code ci-dessous

def test_file2_method1():
	x=5
	y=6
	assert x+1 == y,"test failed"
	assert x == y,"test failed because x=" + str(x) + " y=" + str(y)
def test_file2_method2():
	x=5
	y=6
	assert x+1 == y,"test failed"

Nous avons donc actuellement

โ€ข test_sample1.py
โ€ข test_file1_method1()
โ€ข test_file1_method2()
โ€ข test_sample2.py
โ€ข test_file2_method1()
โ€ข test_file2_method2()

Option 1) Exรฉcuter des tests par correspondance de sous-chaรฎne

Ici, pour exรฉcuter tous les tests ayant la mรฉthode 1 dans son nom, nous devons exรฉcuter

py.test -k method1 -v
-k <expression> is used to represent the substring to match
-v increases the verbosity

Donc exรฉcuter py.test -k method1 -v vous donnera le rรฉsultat suivant

test_sample2.py::test_file2_method1 FAILED
test_sample1.py::test_file1_method1 FAILED

============================================== FAILURES ==============================================
_________________________________________ test_file2_method1 _________________________________________
    def test_file2_method1():
    	x=5
    	y=6
       	assert x+1 == y,"test failed"
>      	assert x == y,"test failed because x=" + str(x) + " y=" + str(y)
E       AssertionError: test failed because x=5 y=6
E       assert 5 == 6
test_sample2.py:5: AssertionError

_________________________________________ test_file1_method1 _________________________________________
    @pytest.mark.only
    def test_file1_method1():
    	x=5
    	y=6
       	assert x+1 == y,"test failed"
>      	assert x == y,"test failed because x=" + str(x) + " y=" + str(y)
E       AssertionError: test failed because x=5 y=6
E       assert 5 == 6
test_sample1.py:8: AssertionError

================================= 2 tests deselected by '-kmethod1' ==================================
=============================== 2 failed, 2 deselected in 0.02 seconds ===============================

Ici vous pouvez voir vers la fin 2 tests dรฉsรฉlectionnรฉs par '-kmethod1' qui sont test_file1_method2 et test_file2_method2

Essayez de courir avec diffรฉrentes combinaisons telles que : -

py.test -k method -v - will run all the four methods
py.test -k methods -v โ€“ will not run any test as there is no test name matches the substring 'methods'

Option 2) Exรฉcuter des tests par marqueurs

Pytest nous permet de dรฉfinir divers attributs pour les mรฉthodes de test ร  l'aide des marqueurs pytest, @pytest.mark . Pour utiliser des marqueurs dans le fichier de test, nous devons importer pytest sur les fichiers de test.

Ici, nous appliquerons diffรฉrents noms de marqueurs aux mรฉthodes de test et exรฉcuterons des tests spรฉcifiques basรฉs sur les noms de marqueurs. Nous pouvons dรฉfinir les marqueurs sur chaque nom de test en utilisant

@pytest.mark.<name>.			

Nous dรฉfinissons les marqueurs set1 et set2 sur les mรฉthodes de test, et nous exรฉcuterons le test en utilisant les noms des marqueurs. Mettez ร  jour les fichiers de test avec le code suivant

test_sample1.py

import pytest
@pytest.mark.set1
def test_file1_method1():
	x=5
	y=6
	assert x+1 == y,"test failed"
	assert x == y,"test failed because x=" + str(x) + " y=" + str(y)

@pytest.mark.set2
def test_file1_method2():
	x=5
	y=6
	assert x+1 == y,"test failed"

test_sample2.py

import pytest
@pytest.mark.set1
def test_file2_method1():
	x=5
	y=6
	assert x+1 == y,"test failed"
	assert x == y,"test failed because x=" + str(x) + " y=" + str(y)

@pytest.mark.set1
def test_file2_method2():
	x=5
	y=6
	assert x+1 == y,"test failed"

Nous pouvons exรฉcuter le test notรฉ en

py.test -m <name>
-m <name> mentions the marker name

Exรฉcutez py.test -m set1. Cela exรฉcutera les mรฉthodes test_file1_method1, test_file2_method1, test_file2_method2.

L'exรฉcution de py.test -m set2 exรฉcutera test_file1_method2.

Exรฉcuter des tests en parallรจle avec Pytest

Habituellement, une suite de tests comprendra plusieurs fichiers de test et des centaines de mรฉthodes de test dont l'exรฉcution prendra un temps considรฉrable. Pytest nous permet d'exรฉcuter des tests en parallรจle.

Pour cela, nous devons d'abord installer pytest-xdist en exรฉcutant

pip install pytest-xdist

Exรฉcuter des tests en parallรจle avec Pytest

Vous pouvez exรฉcuter des tests maintenant en

py.test -n 4

-n exรฉcute les tests en utilisant plusieurs travailleurs. Dans la commande ci-dessus, il y aura 4 travailleurs pour exรฉcuter le test.

Agencements Pytest

Les luminaires sont utilisรฉs lorsque nous voulons exรฉcuter du code avant chaque mรฉthode de test. Ainsi, au lieu de rรฉpรฉter le mรชme code ร  chaque test, nous dรฉfinissons les appareils. Habituellement, les appareils sont utilisรฉs pour initialiser les connexions ร  la base de donnรฉes, transmettre la base, etc.

Une mรฉthode est marquรฉe comme un appareil Pytest en la marquant avec

@pytest.fixture

Une mรฉthode de test peut utiliser un appareil Pytest en mentionnant l'appareil comme paramรจtre d'entrรฉe.

Crรฉez un nouveau fichier test_basic_fixture.py avec le code suivant

import pytest
@pytest.fixture
def supply_AA_BB_CC():
	aa=25
	bb =35
	cc=45
	return [aa,bb,cc]

def test_comparewithAA(supply_AA_BB_CC):
	zz=35
	assert supply_AA_BB_CC[0]==zz,"aa and zz comparison failed"

def test_comparewithBB(supply_AA_BB_CC):
	zz=35
	assert supply_AA_BB_CC[1]==zz,"bb and zz comparison failed"

def test_comparewithCC(supply_AA_BB_CC):
	zz=35
	assert supply_AA_BB_CC[2]==zz,"cc and zz comparison failed"

Ici

  • Nous avons un appareil nommรฉ supply_AA_BB_CC. Cette mรฉthode renverra une liste de 3 valeurs.
  • Nous disposons de 3 mรฉthodes de test comparant chacune des valeurs.

Chacune des fonctions de test a un argument d'entrรฉe dont le nom correspond ร  un appareil disponible. Pytest invoque ensuite la mรฉthode luminaire correspondante et les valeurs renvoyรฉes seront stockรฉes dans l'argument d'entrรฉe, ici la liste [25,35,45]. Dรฉsormais, les รฉlรฉments de la liste sont utilisรฉs dans des mรฉthodes de test pour la comparaison.

Maintenant, lancez le test et voyez le rรฉsultat

 py.test test_basic_fixture
test_basic_fixture.py::test_comparewithAA FAILED                                                                                                                                                                                       
test_basic_fixture.py::test_comparewithBB PASSED                                                                                                                                                                                       
test_basic_fixture.py::test_comparewithCC FAILED
                                                                                                                                                                                       
============================================== FAILURES ==============================================
_________________________________________ test_comparewithAA _________________________________________
supply_AA_BB_CC = [25, 35, 45]
    def test_comparewithAA(supply_AA_BB_CC):
    	zz=35
>   	assert supply_AA_BB_CC[0]==zz,"aa and zz comparison failed"
E    AssertionError: aa and zz comparison failed
E    assert 25 == 35
test_basic_fixture.py:10: AssertionError

_________________________________________ test_comparewithCC _________________________________________
supply_AA_BB_CC = [25, 35, 45]
    def test_comparewithCC(supply_AA_BB_CC):
    	zz=35
>   	assert supply_AA_BB_CC[2]==zz,"cc and zz comparison failed"
E    AssertionError: cc and zz comparison failed
E    assert 45 == 35
test_basic_fixture.py:16: AssertionError
================================= 2 failed, 1 passed in 0.05 seconds =================================

Le test test_comparewithBB est rรฉussi puisque zz=BB=35, et les 2 tests restants ont รฉchouรฉ.

La mรฉthode luminaire a une portรฉe uniquement dans le fichier de test dans lequel elle est dรฉfinie. Si nous essayons d'accรฉder au luminaire dans un autre fichier de test, nous obtiendrons une erreur disant luminaire 'supply_AA_BB_CC' introuvable pour les mรฉthodes de test dans d'autres fichiers.

Pour utiliser le mรชme appareil sur plusieurs fichiers de test, nous allons crรฉer des mรฉthodes d'appareil dans un fichier appelรฉ conftest.py.

Voyons cela ร  l'aide de l'exemple PyTest ci-dessous. Crรฉez 3 fichiers conftest.py, test_basic_fixture.py, test_basic_fixture2.py avec le code suivant

concours.py

import pytest
@pytest.fixture
def supply_AA_BB_CC():
	aa=25
	bb =35
	cc=45
	return [aa,bb,cc]

test_basic_fixture.py

import pytest
def test_comparewithAA(supply_AA_BB_CC):
	zz=35
	assert supply_AA_BB_CC[0]==zz,"aa and zz comparison failed"

def test_comparewithBB(supply_AA_BB_CC):
	zz=35
	assert supply_AA_BB_CC[1]==zz,"bb and zz comparison failed"

def test_comparewithCC(supply_AA_BB_CC):
	zz=35
	assert supply_AA_BB_CC[2]==zz,"cc and zz comparison failed"

test_basic_fixture2.py

import pytest
def test_comparewithAA_file2(supply_AA_BB_CC):
	zz=25
	assert supply_AA_BB_CC[0]==zz,"aa and zz comparison failed"

def test_comparewithBB_file2(supply_AA_BB_CC):
	zz=25
	assert supply_AA_BB_CC[1]==zz,"bb and zz comparison failed"

def test_comparewithCC_file2(supply_AA_BB_CC):
	zz=25
	assert supply_AA_BB_CC[2]==zz,"cc and zz comparison failed"

pytest recherchera d'abord le luminaire dans le fichier de test et s'il ne le trouve pas, il le cherchera dans le conftest.py

Exรฉcutez le test par py.test -k test_comparewith -v pour obtenir le rรฉsultat comme ci-dessous

test_basic_fixture.py::test_comparewithAA FAILED  
test_basic_fixture.py::test_comparewithBB PASSED 
test_basic_fixture.py::test_comparewithCC FAILED 
test_basic_fixture2.py::test_comparewithAA_file2 PASSED 
test_basic_fixture2.py::test_comparewithBB_file2 FAILED 
test_basic_fixture2.py::test_comparewithCC_file2 FAILED

Test paramรฉtrรฉ Pytest

Le but du paramรฉtrage d'un test est d'exรฉcuter un test sur plusieurs ensembles d'arguments. Nous pouvons le faire par @pytest.mark.parametrize.

Nous verrons cela avec l'exemple PyTest ci-dessous. Ici, nous allons passer 3 arguments ร  une mรฉthode de test. Cette mรฉthode de test ajoutera les 2 premiers arguments et les comparera au 3รจme argument.

Crรฉez le fichier de test test_addition.py avec le code ci-dessous

import pytest
@pytest.mark.parametrize("input1, input2, output",[(5,5,10),(3,5,12)])
def test_add(input1, input2, output):
	assert input1+input2 == output,"failed"

Ici, la mรฉthode de test accepte 3 arguments : input1, input2, output. Il ajoute input1 et input2 et compare avec la sortie.

Lanรงons le test par py.test -k test_add -v et voyons le rรฉsultat

test_addition.py::test_add[5-5-10] PASSED                                                                                                                                                                                              
test_addition.py::test_add[3-5-12] FAILED                                                                                                                                                                                              
============================================== FAILURES ==============================================
__________________________________________ test_add[3-5-12] __________________________________________
input1 = 3, input2 = 5, output = 12
    @pytest.mark.parametrize("input1, input2, output",[(5,5,10),(3,5,12)])
    def test_add(input1, input2, output):
>   	assert input1+input2 == output,"failed"
E    AssertionError: failed
E    assert (3 + 5) == 12
test_addition.py:5: AssertionError

Vous pouvez voir les tests exรฉcutรฉs 2 fois โ€“ lโ€™un vรฉrifiant 5+5 ==10 et lโ€™autre vรฉrifiant 3+5 ==12

test_addition.py::test_add[5-5-10] Rร‰USSI

test_addition.py :: test_add [3-5-12] ร‰CHEC

Pytest Xfail / Sauter les tests

Il y aura des situations oรน nous ne voudrons pas exรฉcuter de test, ou un cas de test n'est pas pertinent pour un moment particulier. Dans ces situations, nous avons la possibilitรฉ de faire รฉchouer le test ou de sauter les tests.

Le test xfailed sera exรฉcutรฉ, mais il ne sera pas comptรฉ comme une partie des tests ayant รฉchouรฉ ou rรฉussi. Aucun traรงage ne sera affichรฉ si ce test รฉchoue. Nous pouvons รฉchouer aux tests en utilisant

@pytest.mark.xfail.

Sauter un test signifie que le test ne sera pas exรฉcutรฉ. Nous pouvons sauter des tests en utilisant

@pytest.mark.skip.

Modifiez le test_addition.py avec le code ci-dessous

import pytest
@pytest.mark.skip
def test_add_1():
	assert 100+200 == 400,"failed"

@pytest.mark.skip
def test_add_2():
	assert 100+200 == 300,"failed"

@pytest.mark.xfail
def test_add_3():
	assert 15+13 == 28,"failed"

@pytest.mark.xfail
def test_add_4():
	assert 15+13 == 100,"failed"

def test_add_5():
	assert 3+2 == 5,"failed"

def test_add_6():
	assert 3+2 == 6,"failed"

Ici

  • test_add_1 et test_add_2 sont ignorรฉs et ne seront pas exรฉcutรฉs.
  • test_add_3 et test_add_4 sont xfailed. Ces tests seront exรฉcutรฉs et feront partie des tests xfailed (sur รฉchec du test) ou xpassed (sur rรฉussite du test). Il nโ€™y aura aucune trace des รฉchecs.
  • test_add_5 et test_add_6 seront exรฉcutรฉs et test_add_6 signalera un รฉchec avec traรงage pendant que test_add_5 rรฉussit

Exรฉcutez le test par py.test test_addition.py -v et voyez le rรฉsultat

test_addition.py::test_add_1 SKIPPED
test_addition.py::test_add_2 SKIPPED
test_addition.py::test_add_3 XPASS
test_addition.py::test_add_4 xfail
test_addition.py::test_add_5 PASSED
test_addition.py::test_add_6 FAILED

============================================== FAILURES ==============================================
_____________________________________________ test_add_6 _____________________________________________
    def test_add_6():
>   	assert 3+2 == 6,"failed"
E    AssertionError: failed
E    assert (3 + 2) == 6
test_addition.py:24: AssertionError

================ 1 failed, 1 passed, 2 skipped, 1 xfailed, 1 xpassed in 0.07 seconds =================

Rรฉsultats XML

Nous pouvons crรฉer des rรฉsultats de tests au format XML que nous pouvons transmettre aux serveurs d'intรฉgration continue pour un traitement ultรฉrieur, etc. Cela peut รชtre fait par

py.test test_sample1.py -v โ€“junitxml=โ€result.xmlโ€

Le result.xml enregistrera le rรฉsultat de lโ€™exรฉcution du test. Trouvez un exemple de result.xml ci-dessous

<?xml version="1.0" encoding="UTF-8"?>
<testsuite errors="0" failures="1" name="pytest" skips="0" tests="2" time="0.046">
   <testcase classname="test_sample1" file="test_sample1.py" line="3" name="test_file1_method1" time="0.001384973526">
     <failure message="AssertionError:test failed because x=5 y=6 assert 5 ==6">
    @pytest.mark.set1
    def test_file1_method1():
    	x=5
    	y=6
       	assert x+1 == y,"test failed"
>      	assert x == y,"test failed because x=" + str(x) + " y=" + str(y)
E       AssertionError: test failed because x=5 y=6
E       assert 5 == 6
         test_sample1.py:9: AssertionError
    </failure>
   </testcase>
   <testcase classname="test_sample1" file="test_sample1.py" line="10" name="test_file1_method2" time="0.000830173492432" />
</testsuite>

Depuis nous pouvons voir un total de deux tests dont un a รฉchouรฉ. Ci-dessous, vous pouvez voir les dรฉtails concernant chaque test exรฉcutรฉ sous รฉtiqueter.

Pytest Framework tester une API

Nous allons maintenant crรฉer un petit framework pytest pour tester une API. L'API utilisรฉe ici est gratuite https://reqres.in/. Ce site Web est uniquement destinรฉ ร  fournir une API testable. Ce site Web ne stocke pas nos donnรฉes.

Ici, nous allons รฉcrire quelques tests pour

  • listant certains utilisateurs
  • se connecter avec les utilisateurs

Crรฉez les fichiers ci-dessous avec le code donnรฉ

conftest.py โ€“ dispose d'un appareil qui fournira l'URL de base pour toutes les mรฉthodes de test

import pytest
@pytest.fixture
def supply_url():
	return "https://reqres.in/api"

test_list_user.py โ€“ contient les mรฉthodes de test pour rรฉpertorier les utilisateurs valides et invalides

  • test_list_valid_user teste la rรฉcupรฉration d'un utilisateur valide et vรฉrifie la rรฉponse
  • test_list_invaliduser teste la rรฉcupรฉration d'utilisateur non valide et vรฉrifie la rรฉponse
import pytest
import requests
import json
@pytest.mark.parametrize("userid, firstname",[(1,"George"),(2,"Janet")])
def test_list_valid_user(supply_url,userid,firstname):
	url = supply_url + "/users/" + str(userid)
	resp = requests.get(url)
	j = json.loads(resp.text)
	assert resp.status_code == 200, resp.text
	assert j['data']['id'] == userid, resp.text
	assert j['data']['first_name'] == firstname, resp.text

def test_list_invaliduser(supply_url):
	url = supply_url + "/users/50"
	resp = requests.get(url)
	assert resp.status_code == 404, resp.text

test_login_user.py โ€“ contient des mรฉthodes de test pour tester la fonctionnalitรฉ de connexion.

  • test_login_valid teste la tentative de connexion valide avec e-mail et mot de passe
  • test_login_no_password teste la tentative de connexion invalide sans transmettre le mot de passe
  • test_login_no_email teste la tentative de connexion invalide sans transmettre l'e-mail.
import pytest
import requests
import json
def test_login_valid(supply_url):
	url = supply_url + "/login/" 
	data = {'email':'test@test.com','password':'something'}
	resp = requests.post(url, data=data)
	j = json.loads(resp.text)
	assert resp.status_code == 200, resp.text
	assert j['token'] == "QpwL5tke4Pnpja7X", resp.text

def test_login_no_password(supply_url):
	url = supply_url + "/login/" 
	data = {'email':'test@test.com'}
	resp = requests.post(url, data=data)
	j = json.loads(resp.text)
	assert resp.status_code == 400, resp.text
	assert j['error'] == "Missing password", resp.text

def test_login_no_email(supply_url):
	url = supply_url + "/login/" 
	data = {}
	resp = requests.post(url, data=data)
	j = json.loads(resp.text)
	assert resp.status_code == 400, resp.text
	assert j['error'] == "Missing email or username", resp.text

Exรฉcutez le test en utilisant py.test -v

Voir le rรฉsultat comme

test_list_user.py::test_list_valid_user[1-George] PASSED                                                                                                                                                                               
test_list_user.py::test_list_valid_user[2-Janet] PASSED                                                                                                                                                                                
test_list_user.py::test_list_invaliduser PASSED                                                                                                                                                                                        
test_login_user.py::test_login_valid PASSED                                                                                                                                                                                            
test_login_user.py::test_login_no_password PASSED                                                                                                                                                                                      
test_login_user.py::test_login_no_email PASSED

Mettez ร  jour les tests et essayez diffรฉrentes sorties

Rรฉsumรฉ

Dans ce didacticiel PyTest, nous avons couvert

  • Installez pytest en utilisant installer pip pytest=2.9.1
  • Programme pytest simple et exรฉcutez-le avec la commande py.test.
  • Les instructions d'assertion, assert x==y, renverront True ou False.
  • Comment pytest identifie les fichiers et les mรฉthodes de test.
  • Testez les fichiers commenรงant par tester_ ou se terminant par _tester
  • Mรฉthodes de test commenรงant par tester
  • La commande py.test exรฉcutera tous les fichiers de test dans ce dossier et sous-dossiers. Pour exรฉcuter un fichier spรฉcifique, nous pouvons utiliser la commande py.test
  • Exรฉcuter un sous-ensemble de mรฉthodes de test
  • Regroupement des noms de tests par sous-chaรฎne matching.py.test -k -v exรฉcutera tous les tests ayant en son nom.
  • Exรฉcutez le test par marqueurs. Marquez les tests en utilisant @pytest.mark. et exรฉcutez les tests en utilisant pytest -m pour exรฉcuter des tests marquรฉs comme .
  • Exรฉcuter des tests en parallรจle
  • Installez pytest-xdist en utilisant pip install pytest-xdist
  • Exรฉcutez des tests en utilisant py.test -n NUM oรน NUM est le nombre de travailleurs
  • Crรฉation de mรฉthodes de luminaire pour exรฉcuter du code avant chaque test en marquant la mรฉthode avec @pytest.fixture
  • La portรฉe d'une mรฉthode de luminaire se trouve dans le fichier dans lequel elle est dรฉfinie.
  • Une mรฉthode de luminaire est accessible sur plusieurs fichiers de test en la dรฉfinissant dans le fichier conftest.py.
  • Une mรฉthode de test peut accรฉder ร  un appareil Pytest en l'utilisant comme argument d'entrรฉe.
  • Paramรฉtrer les tests pour les exรฉcuter sur plusieurs ensembles d'entrรฉes.
    @pytest.mark.parametrize("input1, input2, output",[(5,5,10),(3,5,12)])
    def test_add (entrรฉe1, entrรฉe2, sortie) :
    affirmer input1+input2 == sortie, "รฉchec"
    exรฉcutera le test avec les entrรฉes (5,5,10) et (3,5,12)
  • Tests Skip/xfail utilisant @pytets.mark.skip et @pytest.mark.xfail
  • Crรฉez des rรฉsultats de test au format XML qui couvrent les dรฉtails des tests exรฉcutรฉs ร  l'aide de py.test test_sample1.py -v โ€“junitxml="result.xml"
  • Un exemple de framework pytest pour tester une API

Rรฉsumez cet article avec :