current position:Home>Introduction to Python testing framework pytest

Introduction to Python testing framework pytest

2022-02-02 11:46:30 EdisonYao

Pytest brief introduction

Pytest is a mature full-featured Python testing tool that helps you write better programs.
The pytest framework makes it easy to write small tests, yet scales to support complex functional testing for applications and libraries.

   Through the introduction of the official website, we can learn ,pytest Is a very mature full-featured python The test framework , There are mainly

The following features :

  • Simple, flexible and easy to use
  • Support parameterization
  • Support simple unit testing and complex functional testing , It can also be used for automated testing
  • There are many third-party plug-ins , And you can customize the extension
  • Of test cases skip and xfail Handle
  • It can be very good and Jenkins Integrate
  • Support run by nose, unittest Test cases written

Pytest install

  1. Use it directly pip Command to install

pip install -U pytest    # -U Yes, if installed, it will automatically upgrade to the latest version 

  2. Verify installation results

pytest --version    #  Show the currently installed version 

C:\Users\edison>pytest --version
pytest 6.2.5

  3. stay pytest In the test framework , The following constraints apply :

  • The test file name should conform to test_*.py or *_test.py Format ( for example test_min.py)
  • The test class should be Test start , And cannot have init Method
  • In a single test class , Can contain one or more test_ Initial function

Pytest The test execution

  pytest Testing is relatively simple , Let's look at an example :

import pytest    #  Import pytest package 

def test_001():    #  Function to test_ start 
    print("test_01")

def test_002():
    print("test_02")

if __name__ == '__main__':
    pytest.main(["-v","test_1214.py"])    #  call pytest Of main Function execution test 

   Here we define two test functions , Print the result directly , Now perform the test :

============================= test session starts =============================
platform win32 -- Python 3.8.0, pytest-6.2.5, py-1.11.0, pluggy-1.0.0 -- D:\Code\venv\Scripts\python.exe
cachedir: .pytest_cache
rootdir: D:\Code
collecting ... collected 2 items

test_1214.py::test_001 PASSED                                            [ 50%]
test_1214.py::test_002 PASSED                                            [100%]

============================== 2 passed in 0.11s ==============================

Process finished with exit code 0

   The output shows how many cases have been executed 、 Corresponding test module 、 Number of passes and execution time .

Test class main function

pytest.main(["-v","test_1214.py"])
adopt python Code execution pytest.main()
1. Direct execution pytest.main() 【 Automatically find the current directory , With test_ A document that begins with or with _test At the end of the py file 】 2. Set up pytest The execution parameters of pytest.main(['--html=./report.html','test_login.py'])【 perform test_login.py file , And generate html Report in format 】
main() Execution parameters and plug-in parameters can be passed in parentheses , adopt [] Segmentation ,[] Multiple parameters in the pass through ‘ comma ,’ Segmentation
Run all use cases under the directory and sub packages pytest.main([
' Directory name '])
Run all use cases of the specified module pytest.main([
'test_reg.py'])
Run the specified module, specified class, specified use case pytest.main([
'test_reg.py::TestClass::test_method']) Colon division -m=xxx: Run tagged use cases -reruns=xxx: Failed to rerun -q: Quiet mode , Do not output environment information -v: Rich information mode , Output more detailed use case execution information -s: Displays the... In the program print/logging Output --resultlog=./log.txt Generate log --junitxml=./log.xml Generate xml The report

assert methods

  pytest Assertions mainly use Python Native assertion methods , There are mainly the following :

  •  == The content and type must be equal at the same time
  • in Actual results include expected results
  • is Assert that the two values before and after are equal
import pytest    #  Import pytest package 

def add(x,y):    #  Define to test_ Start function 
    return x + y

def test_add():
    assert add(1,2) == 3    #  Assert success 

str1 = "Python,Java,Ruby"
def test_in():
    assert "PHP" in str1    #  Assertion failed 

if __name__ == '__main__':
    pytest.main(["-v","test_pytest.py"])    #  call main Function execution test 
============================= test session starts =============================
platform win32 -- Python 3.8.0, pytest-6.2.5, py-1.11.0, pluggy-1.0.0 -- D:\Code\venv\Scripts\python.exe
cachedir: .pytest_cache
rootdir: D:\Code
collecting ... collected 2 items

test_pytest.py::test_add PASSED                                          [ 50%]
test_pytest.py::test_in FAILED                                           [100%]

================================== FAILURES ===================================
___________________________________ test_in ___________________________________

    def test_in():
>       assert "PHP" in str1
E       AssertionError: assert 'PHP' in 'Python,Java,Ruby'

test_pytest.py:11: AssertionError
=========================== short test summary info ===========================
FAILED test_pytest.py::test_in - AssertionError: assert 'PHP' in 'Python,Java...
========================= 1 failed, 1 passed in 0.18s =========================

Process finished with exit code 0

   You can see that the reason for the error is clearly pointed out in the operation result “AssertionError”, because PHP be not in str1 in .

A detailed explanation of common orders

1. Run the specified case

if __name__ == '__main__':
    pytest.main(["-v","-s","test_1214.py"])

2. Run all use cases in the current folder, including subfolders

if __name__ == '__main__':
    pytest.main(["-v","-s","./"])

3. Run the specified folder (code All use cases in the directory )

if __name__ == '__main__':
    pytest.main(["-v","-s","code/"])

4. Use cases are specified in the run module ( In the running module test_add Use cases )

if __name__ == '__main__':
    pytest.main(["-v","-s","test_pytest.py::test_add"])

5. Maximum number of execution failures

   Use expressions "--maxfail=num" To achieve ( Be careful : There can be no spaces in the expression ), Indicates that the total number of use case failures is equal to num Stop running when .

6. The error message is displayed on one line

   In the actual project, if many use cases fail to execute , Checking the error message will be troublesome . Use "--tb=line" command , It can solve this problem very well .

  Interface call

   Write an interface to query user information locally , adopt pytest To call , And make interface assertions .

 1 # -*- coding: utf-8 -*-
 2 import pytest
 3 import requests
 4 
 5 def test_agent():
 6     r = requests.post(
 7         url="http://127.0.0.1:9000/get_user",
 8         data={
 9             "name": " Wu lei ",
10             "sex": 1
11         },
12         headers={"Content-Type": "application/json"}
13     )
14     print(r.text)
15     assert r.json()['data']['retCode'] == "00" and r.json()['data']['retMsg'] == " Successful call "
16 
17 if __name__ == "__main__":
18     pytest.main(["-v","test_api.py"])

copyright notice
author[EdisonYao],Please bring the original link to reprint, thank you.
https://en.pythonmana.com/2022/02/202202021146274445.html

Random recommended