Εκμάθηση PyTest: Τι είναι το PyTest; (με παραδείγματα)
⚡ Έξυπνη Σύνοψη
Το Pytest είναι ένα Python Πλαίσιο δοκιμών που σας βοηθά να γράφετε απλές, κλιμακούμενες δοκιμές για βάσεις δεδομένων, API και διεπαφές χρήστη. Υποστηρίζει fixtures, παραμετροποίηση, δείκτες, παράλληλες εκτελέσεις και λεπτομερή αναφορά ισχυρισμών, από βασικές δοκιμές μονάδας έως σύνθετες λειτουργικές δοκιμές.

Pytest είναι ένα από τα πιο ευρέως χρησιμοποιούμενα πλαίσια δοκιμών στο Python οικοσύστημα. Διατηρεί τον κώδικα δοκιμών σύντομο και ευανάγνωστο, ανακαλύπτει αυτόματα τις δοκιμές και αναπτύσσεται από μια πρώτη διεκδίκηση σε μια πλήρη σουίτα δοκιμών για βάσεις δεδομένων, API και διεπαφές χρήστη. Οι παρακάτω ενότητες περιγράφουν την εγκατάσταση, τους διεκδικήσεις, τα εξαρτήματα, τους δείκτες, την παραμετροποίηση και τις παράλληλες εκτελέσεις με πρακτικά παραδείγματα.
Τι είναι το Pytest;
Pytest είναι ένα πλαίσιο δοκιμών που σας επιτρέπει να γράφετε κώδικα δοκιμών χρησιμοποιώντας το Python γλώσσα προγραμματισμού. Σας βοηθά να γράφετε απλές και επεκτάσιμες περιπτώσεις δοκιμών για βάσεις δεδομένων, API, ακόμη και διεπαφές χρήστη. Το Pytest χρησιμοποιείται κυρίως για τη σύνταξη δοκιμών για API και κλιμακώνεται από απλές δοκιμές μονάδας έως σύνθετες λειτουργικές δοκιμές.
Γιατί να χρησιμοποιήσετε το Pytest;
Μερικά από τα πλεονεκτήματα του pytest είναι:
- Πολύ εύκολο στην αρχή, λόγω της απλής και καθαρής σύνταξης.
- Μπορεί να εκτελέσει δοκιμές παράλληλα.
- Μπορεί να εκτελέσει μια συγκεκριμένη δοκιμή ή ένα υποσύνολο δοκιμών.
- Εντοπίζει αυτόματα τις δοκιμές.
- Μπορεί να παραλείψει τις εξετάσεις.
- Ανοιχτή πηγή.
Πώς να εγκαταστήσετε το Pytest
Η διαδικασία εγκατάστασης του pytest είναι η εξής:
Βήμα 1) Μπορείτε να εγκαταστήσετε το pytest με την παρακάτω εντολή.
pip install pytest==2.9.1
Μόλις ολοκληρωθεί η εγκατάσταση, μπορείτε να την επιβεβαιώσετε με την ακόλουθη εντολή.
py.test -h
Αυτό θα εμφανίσει τη βοήθεια.
Πρώτο Βασικό Παράδειγμα Pytest
Τώρα, θα μάθετε πώς να χρησιμοποιείτε το pytest με ένα βασικό παράδειγμα pytest.
Δημιουργήστε έναν φάκελο study_pytest. Θα δημιουργήσετε τα αρχεία δοκιμών μέσα σε αυτόν τον φάκελο. Μεταβείτε σε αυτόν τον φάκελο στη γραμμή εντολών σας. Δημιουργήστε ένα αρχείο με το όνομα test_sample1.py μέσα στον φάκελο.
Προσθέστε τον παρακάτω κώδικα σε αυτό και αποθηκεύστε.
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
Εδώ, στο test_sample1.py F., το γράμμα F υποδηλώνει αποτυχία και η τελεία (.) υποδηλώνει επιτυχία. Στην ενότητα αποτυχιών, μπορείτε να δείτε την/τις αποτυχημένη/ες μέθοδο/ες και τη γραμμή αποτυχίας. Εδώ x==y σημαίνει 5==6, το οποίο είναι ψευδές.
Στη συνέχεια, θα μάθετε για τους ισχυρισμούς στο pytest.
Ισχυρισμοί στο Pytest
Οι ισχυρισμοί Pytest είναι έλεγχοι που επιστρέφουν είτε την κατάσταση True είτε την κατάσταση False. Στο pytest, εάν ένας ισχυρισμός αποτύχει σε μια μέθοδο δοκιμής, τότε η εκτέλεση αυτής της μεθόδου διακόπτεται εκεί. Ο υπόλοιπος κώδικας σε αυτήν τη μέθοδο δοκιμής δεν εκτελείται και το pytest συνεχίζει με την επόμενη μέθοδο δοκιμής.
Παραδείγματα ισχυρισμού 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.
Σκεφτείτε τα εξής.
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
Εκτελέστε ένα υποσύνολο ολόκληρης της δοκιμής με το Pytest
Μερικές φορές δεν θέλουμε να εκτελέσουμε ολόκληρη τη σουίτα δοκιμών. Το Pytest μας επιτρέπει να εκτελέσουμε συγκεκριμένες δοκιμές. Μπορούμε να το κάνουμε με δύο τρόπους:
- Grouping των ονομάτων δοκιμών με αντιστοίχιση υποσυμβολοσειρών.
- Grouping των εξετάσεων με βάση τους βαθμολογητές.
Έχουμε ήδη το 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) Εκτέλεση δοκιμών με αντιστοίχιση υποσυμβολοσειρών
Εδώ, για να εκτελέσουμε όλες τις δοκιμές που έχουν τη μέθοδο method1 στο όνομά τους, πρέπει να εκτελέσουμε την παρακάτω εντολή.
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
Μπορείτε τώρα να εκτελέσετε τις δοκιμές με την ακόλουθη εντολή.
py.test -n 4
Εδώ, -n εκτελεί τις δοκιμές χρησιμοποιώντας πολλαπλούς εργάτες. Στην παραπάνω εντολή, θα υπάρχουν τέσσερις εργάτες για να εκτελέσουν τις δοκιμές.
Εξαρτήματα Pytest
Τα fixtures χρησιμοποιούνται όταν θέλουμε να εκτελέσουμε κάποιο κώδικα πριν από κάθε μέθοδο δοκιμής. Έτσι, αντί να επαναλαμβάνουμε τον ίδιο κώδικα σε κάθε δοκιμή, ορίζουμε fixtures. Συνήθως, τα fixtures χρησιμοποιούνται για την αρχικοποίηση συνδέσεων βάσης δεδομένων, τη διέλευση της βάσης δεδομένων. URL, και ούτω καθεξής. Μια μέθοδος επισημαίνεται ως pytest fixture επισημαίνοντάς την με τα ακόλουθα.
@pytest.fixture
Μια μέθοδος δοκιμής μπορεί να χρησιμοποιήσει ένα fixture pytest αναφέροντας το fixture ως παράμετρο εισόδου. Δημιουργήστε ένα νέο αρχείο 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"
Εδώ:
- Έχουμε ένα fixture με όνομα supply_AA_BB_CC. Αυτή η μέθοδος επιστρέφει μια λίστα με τρεις τιμές.
- Έχουμε τρεις μεθόδους δοκιμής που συγκρίνουν καθεμία από τις τιμές.
Κάθε μία από τις συναρτήσεις δοκιμής έχει ένα όρισμα εισόδου του οποίου το όνομα ταιριάζει με ένα διαθέσιμο fixture. Το Pytest στη συνέχεια καλεί την αντίστοιχη μέθοδο fixture και οι τιμές που επιστρέφονται αποθηκεύονται στο όρισμα εισόδου, εδώ τη λίστα [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_comparewithBB είναι επιτυχής, αφού zz=BB=35, και οι υπόλοιπες δύο δοκιμές αποτυγχάνουν.
Η μέθοδος fixture έχει εμβέλεια μόνο εντός του αρχείου δοκιμής όπου έχει οριστεί. Αν προσπαθήσουμε να αποκτήσουμε πρόσβαση στο fixture σε κάποιο άλλο αρχείο δοκιμής, θα λάβουμε ένα σφάλμα που θα λέει fixture Το 'supply_AA_BB_CC' δεν βρέθηκε για τις μεθόδους δοκιμής στα άλλα αρχεία.
Για να χρησιμοποιήσουμε το ίδιο fixture σε πολλά αρχεία δοκιμών, δημιουργούμε μεθόδους fixture σε ένα αρχείο που ονομάζεται conftest.py. Ας το δούμε αυτό με το παρακάτω παράδειγμα pytest. Δημιουργήστε τρία αρχεία, 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 θα αναζητήσει πρώτα το fixture στο αρχείο δοκιμής και, αν δεν βρεθεί, θα το αναζητήσει στο conftest.py. Εκτελέστε το test με 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. Εδώ θα περάσουμε τρία ορίσματα σε μια μέθοδο δοκιμής. Αυτή η μέθοδος δοκιμής θα προσθέσει τα δύο πρώτα ορίσματα και θα συγκρίνει το αποτέλεσμα με το τρίτο όρισμα. Δημιουργήστε το αρχείο δοκιμής 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"
Εδώ η μέθοδος δοκιμής δέχεται τρία ορίσματα: 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
Μπορείτε να δείτε ότι οι δοκιμές εκτελέστηκαν δύο φορές, η μία έλεγξε 5+5 ==10 και η άλλη έλεγξε 3+5 ==12.
test_addition.py::test_add[5-5-10] ΕΠΙΒΕΒΗΚΕ
test_addition.py::test_add[3-5-12] ΑΠΟΤΥΧΕ
Δοκιμές Pytest Xfail και Skip
Θα υπάρξουν ορισμένες περιπτώσεις όπου δεν θέλουμε να εκτελέσουμε μια δοκιμή ή μια περίπτωση δοκιμής δεν είναι σχετικό σε μια συγκεκριμένη χρονική στιγμή. Σε αυτές τις περιπτώσεις, έχουμε την επιλογή να αποτύχουμε στη δοκιμή ή να παραλείψουμε τις δοκιμές. Η δοκιμή που αποτύχει θα εκτελεστεί, αλλά δεν θα μετρηθεί ως μέρος των αποτυχημένων ή επιτυχών δοκιμών. Δεν θα υπάρχει tracΤο eback εμφανίζεται εάν η δοκιμή αποτύχει. Μπορούμε να κάνουμε xfail δοκιμές χρησιμοποιώντας το @pytest.mark.xfail. Παράλειψηping Μια δοκιμή σημαίνει ότι η δοκιμή δεν θα εκτελεστεί. Μπορούμε να παραλείψουμε τις δοκιμές χρησιμοποιώντας την εντολή @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 (σε περίπτωση επιτυχίας δοκιμής). Δεν θα υπάρξει καμία traceback για αποτυχίες.
- Τα test_add_5 και test_add_6 θα εκτελεστούν και το test_add_6 θα αναφέρει σφάλμα με ένα traceback ενώ το 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 για τη δοκιμή ενός API
Τώρα θα δημιουργήσουμε ένα μικρό pytest framework για να δοκιμάσουμε ένα API. Το API που χρησιμοποιείται εδώ είναι ένα δωρεάν από το reqres.inΑυτός ο ιστότοπος παρέχει απλώς ένα δοκιμαστικό API και δεν αποθηκεύει τα δεδομένα μας. Εδώ θα γράψουμε μερικές δοκιμές για τα ακόλουθα:
- Καταγραφή ορισμένων χρηστών.
- Σύνδεση με χρήστες.
Δημιουργήστε τα παρακάτω αρχεία με τον κώδικα που δίνεται. Αρχικά, το conftest.py έχει ένα fixture που θα παρέχει τη βάση 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
Ενημερώστε τις δοκιμές και δοκιμάστε διάφορες εξόδους.




