Οδηγός PyTest: Τι είναι, Πώς να εγκαταστήσετε, Πλαίσιο, Διαβεβαιώσεις

Τι είναι το PyTest;

PyTest είναι ένα πλαίσιο δοκιμών που επιτρέπει στους χρήστες να γράφουν κωδικούς δοκιμής χρησιμοποιώντας Python γλώσσα προγραμματισμού. Σας βοηθά να γράψετε απλές και επεκτάσιμες δοκιμαστικές περιπτώσεις για βάσεις δεδομένων, API ή διεπαφή χρήστη. Το PyTest χρησιμοποιείται κυρίως για τη σύνταξη δοκιμών για API. Βοηθά στη σύνταξη δοκιμών από απλές δοκιμές μονάδων έως πολύπλοκες λειτουργικές δοκιμές.

Γιατί να χρησιμοποιήσετε το PyTest;

Μερικά από τα πλεονεκτήματα του pytest είναι

  • Πολύ εύκολο στην αρχή λόγω της απλής και εύκολης σύνταξης.
  • Μπορεί να εκτελέσει δοκιμές παράλληλα.
  • Μπορεί να εκτελέσει ένα συγκεκριμένο τεστ ή ένα υποσύνολο δοκιμών
  • Αυτόματη ανίχνευση δοκιμών
  • Παράλειψη δοκιμών
  • Ανοιχτή πηγή

Πώς να εγκαταστήσετε το PyTest

Ακολουθεί μια διαδικασία για τον τρόπο εγκατάστασης του PyTest:

Βήμα 1) Μπορείτε να εγκαταστήσετε το pytest από

pip install pytest==2.9.1

Μόλις ολοκληρωθεί η εγκατάσταση, μπορείτε να το επιβεβαιώσετε με το by

py.test -h

Αυτό θα εμφανίσει τη βοήθεια

εγκαταστήστε το PyTest

Πρώτο Βασικό PyTest

Τώρα, θα μάθουμε πώς να χρησιμοποιούμε το Pytest με ένα βασικό παράδειγμα PyTest.

Δημιουργήστε έναν φάκελο study_pytest. Θα δημιουργήσουμε τα δοκιμαστικά μας αρχεία μέσα σε αυτόν τον φάκελο.

Πλοηγηθείτε σε αυτόν τον φάκελο στη γραμμή εντολών σας.

Δημιουργήστε ένα αρχείο με το όνομα test_sample1.py μέσα στο φάκελο

Πρώτο Βασικό PyTest

Προσθέστε τον παρακάτω κώδικα σε αυτό και αποθηκεύστε

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" 

Εκτελέστε τη δοκιμή χρησιμοποιώντας την εντολή

py.test

Θα λάβετε έξοδο ως

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

Πρώτο Βασικό PyTest

Εδώ στο test_sample1.py F.

Ο Φ λέει αποτυχία

Η τελεία(.) λέει επιτυχία.

Στην ενότητα αποτυχίες, μπορείτε να δείτε τις αποτυχημένες μεθόδους και τη γραμμή αποτυχίας. Εδώ το x==y σημαίνει 5==6 που είναι λάθος.

Στη συνέχεια, σε αυτό το σεμινάριο PyTest, θα μάθουμε για τον ισχυρισμό στο PyTest.

Ισχυρισμοί στο PyTest

Οι ισχυρισμοί Pytest είναι έλεγχοι που επιστρέφουν την κατάσταση είτε True είτε False. Σε Python Pytest, εάν ένας ισχυρισμός αποτύχει σε μια μέθοδο δοκιμής, τότε η εκτέλεση αυτής της μεθόδου σταματά εκεί. Ο κώδικας που απομένει σε αυτήν τη μέθοδο δοκιμής δεν εκτελείται και οι ισχυρισμοί Pytest θα συνεχιστούν με την επόμενη μέθοδο δοκιμής.

Παραδείγματα Pytest Assert:

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.

Εξετάστε

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

Τοποθετήστε αυτόν τον κώδικα στο test_file1_method1() αντί για τον ισχυρισμό

assert x == y,"test failed"

Η εκτέλεση της δοκιμής θα δώσει την αποτυχία ως Σφάλμα ισχυρισμού: η δοκιμή απέτυχε x=5 y=6

Πώς το PyTest προσδιορίζει τα αρχεία δοκιμής και τις μεθόδους δοκιμής

Από προεπιλογή, το pytest προσδιορίζει μόνο τα ονόματα των αρχείων που ξεκινούν από δοκιμή_ ή τελειώνει με _δοκιμή ως αρχεία δοκιμής. Μπορούμε ωστόσο να αναφέρουμε ρητά άλλα ονόματα αρχείων (εξηγείται αργότερα). Το Pytest απαιτεί τα ονόματα των μεθόδων δοκιμής για να ξεκινήσουν "δοκιμή.» Όλα τα άλλα ονόματα μεθόδων θα αγνοηθούν ακόμη και αν ζητήσουμε ρητά να εκτελεστούν αυτές οι μέθοδοι.

Δείτε μερικά παραδείγματα έγκυρων και μη έγκυρων ονομάτων αρχείων pytest

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

Σημείωση: Ναι, μπορούμε να ζητήσουμε ρητά από το pytest να επιλέξει testlogin.py και logintest.py

Δείτε μερικά παραδείγματα έγκυρων και μη έγκυρων μεθόδων δοκιμής pytest

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

Σημείωση: Ακόμα κι αν αναφέρουμε ρητά το file1_method1() το pytest δεν θα εκτελέσει αυτήν τη μέθοδο.

Εκτελέστε πολλαπλές δοκιμές από ένα συγκεκριμένο αρχείο και πολλά αρχεία

Αυτήν τη στιγμή, μέσα στο φάκελο study_pytest, έχουμε ένα αρχείο test_sample1.py. Ας υποθέσουμε ότι έχουμε πολλά αρχεία, ας πούμε test_sample2.py, test_sample3.py. Για να εκτελέσουμε όλες τις δοκιμές από όλα τα αρχεία στον φάκελο και τους υποφακέλους, πρέπει απλώς να εκτελέσουμε την εντολή pytest.

py.test

Αυτό θα εκτελέσει όλα τα ονόματα αρχείων που ξεκινούν με test_ και τα ονόματα αρχείων που τελειώνουν με _test σε αυτόν τον φάκελο και τους υποφακέλους κάτω από αυτόν τον φάκελο.

Για να εκτελέσουμε δοκιμές μόνο από ένα συγκεκριμένο αρχείο, μπορούμε να χρησιμοποιήσουμε το py.test

py.test test_sample1.py

Εκτελέστε ένα υποσύνολο του Entire Test με το PyTest

Μερικές φορές δεν θέλουμε να εκτελέσουμε ολόκληρη τη δοκιμαστική σουίτα. Το Pytest μας επιτρέπει να εκτελέσουμε συγκεκριμένες δοκιμές. Μπορούμε να το κάνουμε με 2 τρόπους

  • Ομαδοποίηση ονομάτων δοκιμής με αντιστοίχιση υποσυμβολοσειρών
  • Ομαδοποίηση τεστ με δείκτες

Έχουμε ήδη test_sample1.py. Δημιουργήστε ένα αρχείο test_sample2.py και προσθέστε τον παρακάτω κώδικα σε αυτό

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"

Έτσι έχουμε αυτή τη στιγμή

• test_sample1.py
• test_file1_method1()
• test_file1_method2()
• test_sample2.py
• test_file2_method1()
• test_file2_method2()

Επιλογή 1) Εκτελέστε δοκιμές με αντιστοίχιση υποσυμβολοσειρών

Εδώ για να τρέξουμε όλες τις δοκιμές που έχουν τη μέθοδο1 στο όνομά της πρέπει να τρέξουμε

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

Επομένως, η εκτέλεση του py.test -k method1 -v θα σας δώσει το ακόλουθο αποτέλεσμα

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

Εδώ μπορείτε να δείτε προς το τέλος 2 δοκιμές αποεπιλέχθηκαν από "-kmethod1" που είναι test_file1_method2 και test_file2_method2

Δοκιμάστε να τρέξετε με διάφορους συνδυασμούς όπως:

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'

Επιλογή 2) Εκτελέστε δοκιμές με δείκτες

Το Pytest μας επιτρέπει να ορίσουμε διάφορα χαρακτηριστικά για τις μεθόδους δοκιμής χρησιμοποιώντας δείκτες pytest, @pytest.mark . Για να χρησιμοποιήσουμε δείκτες στο αρχείο δοκιμής, πρέπει να εισαγάγουμε το pytest στα αρχεία δοκιμής.

Εδώ θα εφαρμόσουμε διαφορετικά ονόματα δεικτών σε μεθόδους δοκιμής και θα εκτελέσουμε συγκεκριμένες δοκιμές με βάση τα ονόματα δεικτών. Μπορούμε να ορίσουμε τους δείκτες στα ονόματα κάθε δοκιμής χρησιμοποιώντας

@pytest.mark.<name>.			

Ορίζουμε δείκτες set1 και set2 στις μεθόδους δοκιμής και θα εκτελέσουμε τη δοκιμή χρησιμοποιώντας τα ονόματα των δεικτών. Ενημερώστε τα αρχεία δοκιμής με τον ακόλουθο κώδικα

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"

Μπορούμε να εκτελέσουμε το σημειωμένο τεστ από

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

Εκτελέστε το py.test -m set1. Αυτό θα εκτελέσει τις μεθόδους test_file1_method1, test_file2_method1, test_file2_method2.

Η εκτέλεση του py.test -m set2 θα εκτελέσει το test_file1_method2.

Εκτελέστε δοκιμές παράλληλα με το Pytest

Συνήθως, μια σουίτα δοκιμών θα έχει πολλαπλά αρχεία δοκιμών και εκατοντάδες μεθόδους δοκιμής που θα απαιτήσουν σημαντικό χρόνο για να εκτελεστούν. Το Pytest μας επιτρέπει να εκτελούμε δοκιμές παράλληλα.

Για αυτό πρέπει πρώτα να εγκαταστήσουμε το pytest-xdist εκτελώντας

pip install pytest-xdist

Εκτελέστε δοκιμές παράλληλα με το Pytest

Μπορείτε να εκτελέσετε δοκιμές τώρα μέχρι

py.test -n 4

-n εκτελεί τις δοκιμές χρησιμοποιώντας πολλαπλούς εργαζόμενους. Στην παραπάνω εντολή, θα υπάρχουν 4 εργαζόμενοι για να εκτελέσουν τη δοκιμή.

Εξαρτήματα Pytest

Τα φωτιστικά χρησιμοποιούνται όταν θέλουμε να εκτελέσουμε κάποιο κώδικα πριν από κάθε μέθοδο δοκιμής. Έτσι, αντί να επαναλαμβάνουμε τον ίδιο κώδικα σε κάθε δοκιμή, ορίζουμε φωτιστικά. Συνήθως, τα φωτιστικά χρησιμοποιούνται για την προετοιμασία των συνδέσεων βάσης δεδομένων, τη διέλευση της βάσης κ.λπ

Μια μέθοδος επισημαίνεται ως προσάρτημα Pytest με σήμανση με

@pytest.fixture

Μια μέθοδος δοκιμής μπορεί να χρησιμοποιήσει ένα εξάρτημα Pytest αναφέροντας το εξάρτημα ως παράμετρο εισόδου.

Δημιουργήστε ένα νέο αρχείο test_basic_fixture.py με τον παρακάτω κώδικα

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"

Εδώ

  • Έχουμε ένα εξάρτημα που ονομάζεται supply_AA_BB_CC. Αυτή η μέθοδος θα επιστρέψει μια λίστα με 3 τιμές.
  • Έχουμε 3 μεθόδους δοκιμής που συγκρίνονται με καθεμία από τις τιμές.

Κάθε μια από τις συναρτήσεις δοκιμής έχει ένα όρισμα εισόδου του οποίου το όνομα ταιριάζει με ένα διαθέσιμο εξάρτημα. Στη συνέχεια, το Pytest καλεί την αντίστοιχη μέθοδο προσαρμογής και οι επιστρεφόμενες τιμές θα αποθηκευτούν στο όρισμα εισόδου, εδώ τη λίστα [25,35,45]. Τώρα τα στοιχεία της λίστας χρησιμοποιούνται σε μεθόδους δοκιμής για τη σύγκριση.

Τώρα εκτελέστε το τεστ και δείτε το αποτέλεσμα

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

Το test test_comparewithBB έχει περάσει αφού zz=BB=35 και οι υπόλοιπες 2 δοκιμές απέτυχαν.

Η μέθοδος προσαρμογής έχει πεδίο εφαρμογής μόνο εντός αυτού του αρχείου δοκιμής που έχει οριστεί. Εάν προσπαθήσουμε να αποκτήσουμε πρόσβαση στο εξάρτημα σε κάποιο άλλο αρχείο δοκιμής , θα λάβουμε ένα σφάλμα λέγοντας εξάρτημα Το 'supply_AA_BB_CC' δεν βρέθηκε για τις μεθόδους δοκιμής σε άλλα αρχεία.

Για να χρησιμοποιήσουμε το ίδιο εξάρτημα σε πολλαπλά αρχεία δοκιμής, θα δημιουργήσουμε μεθόδους προσαρμογής σε ένα αρχείο που ονομάζεται conftest.py.

Ας το δούμε αυτό με το παρακάτω παράδειγμα PyTest. Δημιουργήστε 3 αρχεία conftest.py, test_basic_fixture.py, test_basic_fixture2.py με τον παρακάτω κώδικα

contest.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 θα αναζητήσει πρώτα το προσάρτημα στο αρχείο δοκιμής και αν δεν βρεθεί θα το ψάξει στο conftest.py

Εκτελέστε τη δοκιμή από το py.test -k test_comparewith -v για να λάβετε το αποτέλεσμα όπως παρακάτω

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

Ο σκοπός της παραμετροποίησης μιας δοκιμής είναι η εκτέλεση μιας δοκιμής έναντι πολλαπλών συνόλων ορισμάτων. Μπορούμε να το κάνουμε μέσω @pytest.mark.parametrize.

Αυτό θα το δούμε με το παρακάτω παράδειγμα PyTest. Εδώ θα περάσουμε 3 ορίσματα σε μια μέθοδο δοκιμής. Αυτή η μέθοδος δοκιμής θα προσθέσει τα 2 πρώτα ορίσματα και θα τα συγκρίνει με το 3ο όρισμα.

Δημιουργήστε το αρχείο δοκιμής test_addition.py με τον παρακάτω κώδικα

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"

Εδώ η μέθοδος δοκιμής δέχεται 3 ορίσματα - input1, input2, output. Προσθέτει τα input1 και input2 και συγκρίνει με την έξοδο.

Ας εκτελέσουμε τη δοκιμή από το py.test -k test_add -v και ας δούμε το αποτέλεσμα

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

Μπορείτε να δείτε τις δοκιμές που έγιναν 2 φορές – η μία ελέγχοντας 5+5 ==10 και την άλλη 3+5 ==12

test_addition.py::test_add[5-5-10] ΕΠΙΒΕΒΗΚΕ

test_addition.py::test_add[3-5-12] ΑΠΟΤΥΧΕ

Pytest Xfail / Παράλειψη δοκιμών

Θα υπάρξουν ορισμένες περιπτώσεις όπου δεν θέλουμε να εκτελέσουμε μια δοκιμή ή α περίπτωση δοκιμής δεν είναι σχετικό για μια συγκεκριμένη χρονική στιγμή. Σε αυτές τις περιπτώσεις, έχουμε την επιλογή να αποτύχουμε στη δοκιμή ή να παραλείψουμε τις δοκιμές

Το x αποτυχημένο τεστ θα εκτελεστεί, αλλά δεν θα μετρηθεί ως αποτυχημένο μέρος ή ως επιτυχές τεστ. Δεν θα εμφανίζεται ανίχνευση αν αυτό το τεστ αποτύχει. Μπορούμε να xfail tests χρησιμοποιώντας

@pytest.mark.xfail.

Η παράλειψη μιας δοκιμής σημαίνει ότι η δοκιμή δεν θα εκτελεστεί. Μπορούμε να παραλείψουμε τις δοκιμές χρησιμοποιώντας

@pytest.mark.skip.

Επεξεργαστείτε το test_addition.py με τον παρακάτω κώδικα

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"

Εδώ

  • Οι test_add_1 και test_add_2 παραλείπονται και δεν θα εκτελεστούν.
  • Οι test_add_3 και test_add_4 αποτυγχάνουν. Αυτές οι δοκιμές θα εκτελεστούν και θα αποτελούν μέρος των δοκιμών xfailed (σε αποτυχία δοκιμής) ή xpassed (on test pass). Δεν θα υπάρχει κανένα ίχνος για αποτυχίες.
  • Οι test_add_5 και test_add_6 θα εκτελεστούν και το test_add_6 θα αναφέρει αποτυχία με ανίχνευση ενώ το test_add_5 περνάει

Εκτελέστε τη δοκιμή με py.test test_addition.py -v και δείτε το αποτέλεσμα

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

Αποτελέσματα XML

Μπορούμε να δημιουργήσουμε αποτελέσματα δοκιμών σε μορφή XML τα οποία μπορούμε να τροφοδοτήσουμε σε διακομιστές συνεχούς ενοποίησης για περαιτέρω επεξεργασία και ούτω καθεξής. Αυτό μπορεί να γίνει από

py.test test_sample1.py -v –junitxml=”result.xml”

Το result.xml θα καταγράψει το αποτέλεσμα της εκτέλεσης της δοκιμής. Βρείτε ένα δείγμα 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>

Από μπορούμε να δούμε συνολικά δύο δοκιμές εκ των οποίων το ένα απέτυχε. Παρακάτω μπορείτε να δείτε τις λεπτομέρειες σχετικά με κάθε δοκιμή που εκτελείται κάτω ετικέτα.

Pytest Framework Δοκιμή ενός API

Τώρα θα δημιουργήσουμε ένα μικρό πλαίσιο pytest για να δοκιμάσουμε ένα API. Το API που χρησιμοποιείται εδώ είναι δωρεάν από https://reqres.in/. Αυτός ο ιστότοπος είναι απλώς για να παρέχει ελεγχόμενο API. Αυτός ο ιστότοπος δεν αποθηκεύει τα δεδομένα μας.

Εδώ θα γράψουμε μερικά τεστ για

  • παραθέτοντας ορισμένους χρήστες
  • συνδεθείτε με χρήστες

Δημιουργήστε τα παρακάτω αρχεία με τον κωδικό που δίνεται

conftest.py – έχετε ένα εξάρτημα που θα παρέχει το βασικό url για όλες τις μεθόδους δοκιμής

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

test_list_user.py – περιέχει τις μεθόδους δοκιμής για την καταχώριση έγκυρων και μη έγκυρων χρηστών

  • Το test_list_valid_user δοκιμάζει για έγκυρη ανάκτηση χρήστη και επαληθεύει την απόκριση
  • Το test_list_invaliduser ελέγχει την ανάκτηση μη έγκυρου χρήστη και επαληθεύει την απόκριση
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 – περιέχει μεθόδους δοκιμής για τον έλεγχο της λειτουργικότητας σύνδεσης.

  • Το test_login_valid ελέγχει την έγκυρη προσπάθεια σύνδεσης με email και κωδικό πρόσβασης
  • Το test_login_no_password ελέγχει τη μη έγκυρη προσπάθεια σύνδεσης χωρίς να περάσει κωδικό πρόσβασης
  • Το test_login_no_email ελέγχει τη μη έγκυρη προσπάθεια σύνδεσης χωρίς να περάσει email.
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

Εκτελέστε τη δοκιμή χρησιμοποιώντας py.test -v

Δείτε το αποτέλεσμα ως

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

Ενημερώστε τις δοκιμές και δοκιμάστε διάφορες εξόδους

Σύνοψη

Σε αυτό το σεμινάριο PyTest, καλύψαμε

  • Εγκαταστήστε το pytest χρησιμοποιώντας εγκατάσταση pip pytest=2.9.1
  • Απλό πρόγραμμα pytest και εκτελέστε το με την εντολή py.test.
  • Οι δηλώσεις ισχυρισμών, βεβαιωθείτε ότι x==y, θα επιστρέψουν είτε Σωστό είτε Λάθος.
  • Πώς το pytest προσδιορίζει τα αρχεία και τις μεθόδους δοκιμής.
  • Δοκιμή αρχείων ξεκινώντας με δοκιμή_ ή τελειώνει με _δοκιμή
  • Μέθοδοι δοκιμής ξεκινώντας με δοκιμή
  • Η εντολή py.test θα εκτελέσει όλα τα δοκιμαστικά αρχεία σε αυτόν τον φάκελο και τους υποφακέλους. Για να εκτελέσουμε ένα συγκεκριμένο αρχείο, μπορούμε να χρησιμοποιήσουμε την εντολή py.test
  • Εκτελέστε ένα υποσύνολο μεθόδων δοκιμής
  • Ομαδοποίηση ονομάτων δοκιμής με υποσυμβολοσειρά matching.py.test -k -V θα εκτελέσει όλες τις δοκιμές έχοντας στο όνομά του.
  • Εκτελέστε τη δοκιμή με δείκτες. Επισημάνετε τις δοκιμές χρησιμοποιώντας το @pytest.mark. και εκτελέστε τις δοκιμές χρησιμοποιώντας pytest -m για να εκτελέσετε δοκιμές που έχουν επισημανθεί ως .
  • Εκτελέστε δοκιμές παράλληλα
  • Εγκαταστήστε το pytest-xdist χρησιμοποιώντας το pip install pytest-xdist
  • Εκτελέστε δοκιμές χρησιμοποιώντας py.test -n NUM όπου NUM είναι ο αριθμός των εργαζομένων
  • Δημιουργία μεθόδων προσαρμογής για εκτέλεση κώδικα πριν από κάθε δοκιμή, επισημαίνοντας τη μέθοδο με @pytest.fixture
  • Το πεδίο εφαρμογής μιας μεθόδου προσαρμογής βρίσκεται εντός του αρχείου που ορίζεται.
  • Μια μέθοδος προσαρμογής μπορεί να προσπελαστεί σε πολλά αρχεία δοκιμής ορίζοντας την στο αρχείο conftest.py.
  • Μια μέθοδος δοκιμής μπορεί να έχει πρόσβαση σε ένα εξάρτημα Pytest χρησιμοποιώντας το ως όρισμα εισαγωγής.
  • Παραμετροποίηση δοκιμών για την εκτέλεση του σε πολλαπλά σετ εισόδων.
    @pytest.mark.parametrize("input1, input2, output",[(5,5,10),(3,5,12)])
    def test_add(input1, input2, output):
    διεκδίκηση εισόδου1+εισόδου2 == έξοδος, "αποτυχία"
    θα εκτελέσει τη δοκιμή με τις εισόδους (5,5,10) και (3,5,12)
  • Παράλειψη δοκιμών/xfail χρησιμοποιώντας @pytets.mark.skip και @pytest.mark.xfail
  • Δημιουργήστε αποτελέσματα δοκιμών σε μορφή XML που καλύπτει τις λεπτομέρειες δοκιμής που εκτελέστηκαν χρησιμοποιώντας py.test test_sample1.py -v –junitxml=”result.xml”
  • Ένα δείγμα πλαισίου δοκιμής pytest για τη δοκιμή ενός API