PyTest-Tutorial: Was ist, wie installiert man, Framework, Behauptungen

Was ist PyTest?

PyTest ist ein Testframework, das es Benutzern ermรถglicht, Testcodes zu schreiben mit Python Programmiersprache. Es hilft Ihnen, einfache und skalierbare Testfรคlle fรผr Datenbanken, APIs oder Benutzeroberflรคchen zu schreiben. PyTest wird hauptsรคchlich zum Schreiben von Tests fรผr APIs verwendet. Es hilft beim Schreiben von Tests von einfachen Unit-Tests bis hin zu komplexen Funktionstests.

Warum PyTest verwenden?

Einige der Vorteile von Pytest sind

  • Aufgrund der einfachen und einfachen Syntax ist der Einstieg sehr einfach.
  • Kann Tests parallel ausfรผhren.
  • Kann einen bestimmten Test oder eine Teilmenge von Tests ausfรผhren
  • Tests automatisch erkennen
  • รœberspringen Sie Tests
  • Open Source

So installieren Sie PyTest

Nachfolgend wird die Vorgehensweise zur Installation von PyTest beschrieben:

Schritt 1) Sie kรถnnen Pytest per installieren

pip install pytest==2.9.1

Sobald die Installation abgeschlossen ist, kรถnnen Sie diese mit bestรคtigen

py.test -h

Dadurch wird die Hilfe angezeigt

Installieren Sie PyTest

Erster grundlegender PyTest

Jetzt lernen wir anhand eines einfachen PyTest-Beispiels, wie man Pytest verwendet.

Erstellen Sie einen Ordner โ€žstudie_pytestโ€œ. Wir werden unsere Testdateien in diesem Ordner erstellen.

Bitte navigieren Sie in Ihrer Befehlszeile zu diesem Ordner.

Erstellen Sie im Ordner eine Datei mit dem Namen test_sample1.py

Erster grundlegender PyTest

Fรผgen Sie den folgenden Code hinzu und speichern Sie ihn

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" 

Fรผhren Sie den Test mit dem Befehl aus

py.test

Sie erhalten die Ausgabe als

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

Erster grundlegender PyTest

Hier in test_sample1.py F.

F sagt Misserfolg

Punkt(.) sagt Erfolg.

Im Abschnitt โ€žFehlerโ€œ kรถnnen Sie die fehlgeschlagene(n) Methode(n) und die Fehlerzeile sehen. Hier bedeutet x==y 5==6, was falsch ist.

Als nรคchstes lernen wir in diesem PyTest-Tutorial etwas รผber die Behauptung in PyTest.

Behauptungen in PyTest

Pytest-Assertionen sind Prรผfungen, die entweder den Status True oder False zurรผckgeben. In Python Pytest: Wenn eine Behauptung in einer Testmethode fehlschlรคgt, wird die Ausfรผhrung dieser Methode an dieser Stelle gestoppt. Der verbleibende Code in dieser Testmethode wird nicht ausgefรผhrt und Pytest-Behauptungen werden mit der nรคchsten Testmethode fortgesetzt.

Pytest Assert-Beispiele:

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.

Geht davon

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

Platzieren Sie diesen Code in test_file1_method1() anstelle der Behauptung

assert x == y,"test failed"

Wenn Sie den Test ausfรผhren, wird der Fehler als angezeigt AssertionError: Test fehlgeschlagen x=5 y=6

Wie PyTest die Testdateien und Testmethoden identifiziert

StandardmรครŸig identifiziert Pytest nur die Dateinamen, die mit beginnen Prรผfung_ oder endend mit _Prรผfung als Testdateien. Wir kรถnnen jedoch explizit andere Dateinamen angeben (wird spรคter erklรคrt). Pytest erfordert, dass die Namen der Testmethoden mit beginnen "prรผfen.โ€œ Alle anderen Methodennamen werden ignoriert, auch wenn wir ausdrรผcklich dazu auffordern, diese Methoden auszufรผhren.

Sehen Sie sich einige Beispiele fรผr gรผltige und ungรผltige Pytest-Dateinamen an

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

Hinweis: Ja, wir kรถnnen pytest explizit bitten, testlogin.py und logintest.py auszuwรคhlen

Sehen Sie sich einige Beispiele fรผr gรผltige und ungรผltige Pytest-Testmethoden an

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

Hinweis: Auch wenn wir file1_method1() ausdrรผcklich erwรคhnen, fรผhrt Pytest diese Methode nicht aus.

Fรผhren Sie mehrere Tests aus einer bestimmten Datei und mehreren Dateien aus

Derzeit haben wir im Ordner โ€žstudie_pytestโ€œ eine Datei โ€žtest_sample1.pyโ€œ. Angenommen, wir haben mehrere Dateien, sagen wir test_sample2.py, test_sample3.py. Um alle Tests fรผr alle Dateien im Ordner und in den Unterordnern auszufรผhren, mรผssen wir lediglich den Befehl pytest ausfรผhren.

py.test

Dadurch werden alle Dateinamen ausgefรผhrt, die mit test_ beginnen und mit _test enden, in diesem Ordner und in den Unterordnern unter diesem Ordner.

Um Tests nur aus einer bestimmten Datei auszufรผhren, kรถnnen wir py.test verwenden

py.test test_sample1.py

Fรผhren Sie eine Teilmenge des gesamten Tests mit PyTest aus

Manchmal mรถchten wir nicht die gesamte Testsuite ausfรผhren. Mit Pytest kรถnnen wir spezifische Tests durchfรผhren. Wir kรถnnen es auf zwei Arten tun

  • Gruppierung von Testnamen nach Teilzeichenfolgenรผbereinstimmung
  • Gruppierung von Tests nach Markern

Wir haben bereits test_sample1.py. Erstellen Sie eine Datei test_sample2.py und fรผgen Sie den folgenden Code hinzu

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"

So haben wir derzeit

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

Option 1) Fรผhren Sie Tests durch Teilzeichenfolgenabgleich durch

Hier mรผssen wir alle Tests ausfรผhren, deren Name method1 enthรคlt

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

Wenn Sie also py.test -k method1 -v ausfรผhren, erhalten Sie das folgende Ergebnis

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 ===============================

Hier sieht man das Ende 2 Tests von '-kmethod1' abgewรคhlt Das sind test_file1_method2 und test_file2_method2

Versuchen Sie, mit verschiedenen Kombinationen zu laufen, wie zum Beispiel:

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) Fรผhren Sie Tests nach Markern durch

Mit Pytest kรถnnen wir mithilfe der Pytest-Marker @pytest.mark verschiedene Attribute fรผr die Testmethoden festlegen. Um Markierungen in der Testdatei zu verwenden, mรผssen wir Pytest in die Testdateien importieren.

Hier wenden wir unterschiedliche Markernamen auf Testmethoden an und fรผhren spezifische Tests basierend auf Markernamen durch. Wir kรถnnen die Markierungen fรผr jeden Testnamen definieren, indem wir verwenden

@pytest.mark.<name>.			

Wir definieren die Marker set1 und set2 fรผr die Testmethoden und fรผhren den Test mit den Markernamen aus. Aktualisieren Sie die Testdateien mit dem folgenden Code

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"

Wir kรถnnen den markierten Test ausfรผhren

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

Fรผhren Sie py.test -m set1 aus. Dadurch werden die Methoden test_file1_method1, test_file2_method1, test_file2_method2 ausgefรผhrt.

Wenn Sie py.test -m set2 ausfรผhren, wird test_file1_method2 ausgefรผhrt.

Fรผhren Sie Tests parallel mit Pytest durch

Normalerweise verfรผgt eine Testsuite รผber mehrere Testdateien und Hunderte von Testmethoden, deren Ausfรผhrung viel Zeit in Anspruch nimmt. Mit Pytest kรถnnen wir Tests parallel ausfรผhren.

Dazu mรผssen wir zunรคchst pytest-xdist durch Ausfรผhren installieren

pip install pytest-xdist

Fรผhren Sie Tests parallel mit Pytest durch

Sie kรถnnen jetzt Tests durchfรผhren

py.test -n 4

-N fรผhrt die Tests mit mehreren Workern aus. Im obigen Befehl gibt es 4 Worker, die den Test ausfรผhren.

Pytest-Gerรคte

Fixtures werden verwendet, wenn wir vor jeder Testmethode Code ausfรผhren mรถchten. Anstatt also bei jedem Test denselben Code zu wiederholen, definieren wir Fixtures. Normalerweise werden Fixtures verwendet, um Datenbankverbindungen zu initialisieren, die Basis zu รผbergeben usw

Eine Methode wird durch Markieren mit als Pytest-Fixture markiert

@pytest.fixture

Eine Testmethode kann ein Pytest-Fixture verwenden, indem sie das Fixture als Eingabeparameter angibt.

Erstellen Sie eine neue Datei test_basic_fixture.py mit folgendem Code

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"

Hier

  • Wir haben ein Fixture namens โ€žsupply_AA_BB_CCโ€œ. Diese Methode gibt eine Liste mit 3 Werten zurรผck.
  • Wir haben 3 Testmethoden, die jeden der Werte vergleichen.

Jede Testfunktion verfรผgt รผber ein Eingabeargument, dessen Name mit einem verfรผgbaren Gerรคt รผbereinstimmt. Pytest ruft dann die entsprechende Fixture-Methode auf und die zurรผckgegebenen Werte werden im Eingabeargument gespeichert, hier die Liste [25,35,45]. Jetzt werden die Listenelemente in Testmethoden fรผr den Vergleich verwendet.

Fรผhren Sie nun den Test durch und sehen Sie sich das Ergebnis an

 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 =================================

Der Test test_comparewithBB ist bestanden, da zz=BB=35, und die verbleibenden 2 Tests sind fehlgeschlagen.

Die Fixture-Methode hat nur innerhalb der Testdatei, in der sie definiert ist, einen Gรผltigkeitsbereich. Wenn wir versuchen, auf das Fixture in einer anderen Testdatei zuzugreifen, erhalten wir die Fehlermeldung Fixture โ€žsupply_AA_BB_CCโ€œ nicht gefunden fรผr die Testmethoden in anderen Dateien.

Um dasselbe Fixture fรผr mehrere Testdateien zu verwenden, erstellen wir Fixture-Methoden in einer Datei namens conftest.py.

Sehen wir uns das anhand des folgenden PyTest-Beispiels an. Erstellen Sie 3 Dateien conftest.py, test_basic_fixture.py, test_basic_fixture2.py mit dem folgenden Code

conftest.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 sucht zuerst in der Testdatei nach dem Fixture. Wenn es nicht gefunden wird, sucht es in conftest.py

Fรผhren Sie den Test mit py.test -k test_comparewith -v aus, um das folgende Ergebnis zu erhalten

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

Pytest parametrisierter Test

Der Zweck der Parametrisierung eines Tests besteht darin, einen Test anhand mehrerer Argumentsรคtze auszufรผhren. Wir kรถnnen dies durch @pytest.mark.parametrize tun.

Wir werden dies anhand des folgenden PyTest-Beispiels sehen. Hier รผbergeben wir 3 Argumente an eine Testmethode. Diese Testmethode fรผgt die ersten beiden Argumente hinzu und vergleicht sie mit dem dritten Argument.

Erstellen Sie die Testdatei test_addition.py mit dem folgenden Code

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"

Hier akzeptiert die Testmethode 3 Argumente: Eingabe1, Eingabe2, Ausgabe. Sie addiert Eingabe1 und Eingabe2 und vergleicht mit der Ausgabe.

Lassen Sie uns den Test mit py.test -k test_add -v ausfรผhren und das Ergebnis sehen

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

Sie kรถnnen sehen, dass die Tests zweimal ausgefรผhrt wurden โ€“ einer prรผfte 2+5 ==5 und der andere prรผfte 10+3 ==5

test_addition.py::test_add[5-5-10] BESTANDEN

test_addition.py::test_add[3-5-12] FEHLGESCHLAGEN

Pytest Xfail / Tests รผberspringen

Es wird Situationen geben, in denen wir keinen Test ausfรผhren mรถchten oder a Testfall ist fรผr einen bestimmten Zeitpunkt nicht relevant. In solchen Situationen haben wir die Mรถglichkeit, den Test mit Xfail zu bestehen oder die Tests zu รผberspringen

Der xfailed-Test wird ausgefรผhrt, aber er wird nicht als Teil der fehlgeschlagenen oder bestandenen Tests gezรคhlt. Es wird kein Traceback angezeigt, wenn dieser Test fehlschlรคgt. Wir kรถnnen xfail-Tests verwenden

@pytest.mark.xfail.

Das รœberspringen eines Tests bedeutet, dass der Test nicht ausgefรผhrt wird. Wir kรถnnen Tests mit รผberspringen

@pytest.mark.skip.

Bearbeiten Sie test_addition.py mit dem folgenden Code

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"

Hier

  • test_add_1 und test_add_2 werden รผbersprungen und nicht ausgefรผhrt.
  • test_add_3 und test_add_4 sind xfailed. Diese Tests werden ausgefรผhrt und sind Teil von xfailed-Tests (bei Testfehler) oder xpassed-Tests (bei bestandenem Test). Es gibt keine Rรผckverfolgung fรผr Fehler.
  • test_add_5 und test_add_6 werden ausgefรผhrt und test_add_6 meldet einen Fehler mit Traceback, wรคhrend test_add_5 erfolgreich ist

Fรผhren Sie den Test mit py.test test_addition.py -v aus und sehen Sie sich das Ergebnis an

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 =================

Ergebnisse XML

Wir kรถnnen Testergebnisse im XML-Format erstellen, die wir zur weiteren Verarbeitung usw. an Continuous-Integration-Server weiterleiten kรถnnen. Dies kann durch erfolgen

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

Die result.xml zeichnet das Ergebnis der Testausfรผhrung auf. Nachfolgend finden Sie ein Beispiel fรผr result.xml

<?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>

Aus Wir sehen insgesamt zwei Tests, von denen einer fehlgeschlagen ist. Darunter sehen Sie die Details zu jedem ausgefรผhrten Test unter Etikett.

Pytest Framework Testen einer API

Jetzt erstellen wir ein kleines Pytest-Framework, um eine API zu testen. Die hier verwendete API ist kostenlos von https://reqres.in/. Diese Website dient lediglich der Bereitstellung einer testbaren API. Diese Website speichert unsere Daten nicht.

Hier werden wir einige Tests schreiben

  • Auflistung einiger Benutzer
  • Mit Benutzern anmelden

Erstellen Sie die folgenden Dateien mit dem angegebenen Code

conftest.py โ€“ verfรผgt รผber ein Fixture, das die Basis-URL fรผr alle Testmethoden bereitstellt

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

test_list_user.py โ€“ enthรคlt die Testmethoden zum Auflisten gรผltiger und ungรผltiger Benutzer

  • test_list_valid_user testet den gรผltigen Benutzerabruf und รผberprรผft die Antwort
  • test_list_invaliduser testet auf ungรผltigen Benutzerabruf und รผberprรผft die Antwort
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 โ€“ enthรคlt Testmethoden zum Testen der Anmeldefunktionalitรคt.

  • test_login_valid testet den gรผltigen Anmeldeversuch mit E-Mail und Passwort
  • test_login_no_password testet den ungรผltigen Anmeldeversuch ohne รœbergabe des Passworts
  • test_login_no_email testet den ungรผltigen Anmeldeversuch ohne Weitergabe der E-Mail.
import pytest
import requests
import json
def test_login_valid(supply_url):
	url = supply_url + "/login/" 
	data = {'email':'[email protected]','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':'[email protected]'}
	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

Fรผhren Sie den Test mit py.test -v aus

Sehen Sie sich das Ergebnis an als

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

Aktualisieren Sie die Tests und probieren Sie verschiedene Ausgaben aus

Zusammenfassung

In diesem PyTest-Tutorial haben wir es behandelt

  • Installieren Sie Pytest mit pip installieren pytest=2.9.1
  • Einfaches Pytest-Programm und fรผhren Sie es mit dem Befehl py.test aus.
  • Behauptungsanweisungen, โ€žasser x==yโ€œ, geben entweder โ€žTrueโ€œ oder โ€žFalseโ€œ zurรผck.
  • Wie Pytest Testdateien und -methoden identifiziert.
  • Testdateien beginnend mit Prรผfung_ oder endend mit _Prรผfung
  • Testmethoden beginnend mit Test
  • Der Befehl py.test fรผhrt alle Testdateien in diesem Ordner und seinen Unterordnern aus. Um eine bestimmte Datei auszufรผhren, kรถnnen wir den Befehl py.test verwenden
  • Fรผhren Sie eine Teilmenge der Testmethoden aus
  • Gruppierung von Testnamen nach Teilzeichenfolge Matching.py.test -k -v fรผhrt alle Tests aus in seinem Namen.
  • Fรผhren Sie den Test mit Markern aus. Markieren Sie die Tests mit @pytest.mark. und fรผhren Sie die Tests mit pytest -m aus um Tests auszufรผhren, die als markiert sind .
  • Fรผhren Sie Tests parallel durch
  • Installieren Sie pytest-xdist mit pip install pytest-xdist
  • Fรผhren Sie Tests mit py.test -n NUM aus, wobei NUM die Anzahl der Arbeiter ist
  • Erstellen Sie Fixture-Methoden, um Code vor jedem Test auszufรผhren, indem Sie die Methode mit @pytest.fixture markieren
  • Der Geltungsbereich einer Fixture-Methode liegt in der Datei, in der sie definiert ist.
  • Auf eine Fixture-Methode kann รผber mehrere Testdateien hinweg zugegriffen werden, indem sie in der Datei conftest.py definiert wird.
  • Eine Testmethode kann auf ein Pytest-Fixture zugreifen, indem sie es als Eingabeargument verwendet.
  • Parametrisierung von Tests, um sie anhand mehrerer Eingabesรคtze auszufรผhren.
    @pytest.mark.parametrize(โ€œEingabe1, Eingabe2, Ausgabeโ€,[(5,5,10),(3,5,12)])
    def test_add(Eingabe1, Eingabe2, Ausgabe):
    Behauptung Eingabe1+Eingabe2 == Ausgabe, fehlgeschlagen
    fรผhrt den Test mit den Eingaben (5,5,10) und (3,5,12) durch.
  • รœberspringen/xfail-Tests mit @pytets.mark.skip und @pytest.mark.xfail
  • Erstellen Sie Testergebnisse im XML-Format, die ausgefรผhrte Testdetails abdecken, mit py.test test_sample1.py -v โ€“junitxml=โ€result.xmlโ€
  • Ein Beispiel-Pytest-Framework zum Testen einer API

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: