Οδηγός 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.
Δημιουργήστε έναν φάκελο 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.
Ο Φ λέει αποτυχία
Η τελεία(.) λέει επιτυχία.
Στην ενότητα αποτυχίες, μπορείτε να δείτε τις αποτυχημένες μεθόδους και τη γραμμή αποτυχίας. Εδώ το 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
Μπορείτε να εκτελέσετε δοκιμές τώρα μέχρι
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