Pytest 1、安装,调试。基础前后置方法

Pytest 1、安装,调试。基础前后置方法

1、Pytest 和 UniTest

看完区别,我直接选择 Pytest,因为兼容Unitest
具体区别(转载):https://www.cnblogs.com/liudinglong/p/12846986.html

2、安装Pytest

pip install -U pytest

3、启动测试

- 新建 test_pytest.py 文件
- 文件内容写入

# -*- coding: utf-8 -*-
import pytest
def test_aba():
    b = 2
    print('\n不在类中的普通函数,只运行一次')
    assert b < 3
if __name__ == '__main__':
	pytest.main(['-sv'])	#显示逐步运行
	

4、基础规则

1. py文件需要以test_开头
2. 方法以test_开头,为单元测试用例,pytest.main会执行
3. 类以Test_开头,为单元测试类,类里面test_开头的方法会被执行
class Test_api():
	def test_aa(self):
        	a = 1
        	print('\n我是 Test_api 类里的方法用例:test_aa') 
        	assert a > 0
4. setup_module(),模块级别(最高),放在文件内,会在启动.py时最先执行(放类里面,不会被检测到)全局的,整个模块开只运行一次,优先于测试用例。
def setup_class(self):
        assert 1 < 3
        print('\n Test_api 此类用例 前 只执行一次')

5. teardown_module(),模块级别(最高),放在文件内,会在结束.py时最后执行(放类里面,不会被检测到)全局的,整个模块开只运行一次。
6. setup_class(),类级别:定义在类里面,只针对此类生效,类运行时第一时间运行,只运行一次,优先于测试用例。
7. teardown_class(),类级别:定义在类里面,只针对此类生效,类运行结束时运行,只运行一次。
8. setup_function(),函数级别:只对函数生效,类里面的函数不生效。每个test_开头的函数运行前都会先运行一次(放类里面,不会被检测到)
9. teardown_function(),函数级别:只对函数生效,类里面的函数不生效。每个test_开头的函数运行结束都会运行一次
10. setup_method(),方法级别:定义在类里面,只有类运行后才生效,类里每个test_开头的方法用例执行前都会执行一次
11. teardown_method(),方法级别:定义在类里面,只有类运行后才生效,类里每个test_开头的方法用例执行后都会执行一次
12. 执行顺序优先级: 模块级别 > 函数级别 > 类级别 > 类方法级别

5、 pytest中参数化的用法

在测试用例的前面加上:
@pytest.mark.parametrize("参数名",列表数据)
参数名:用来接收每一项数据,并作为测试用例的参数。
列表数据:一组测试数据。

@pytest.mark.parametrize("参数1,参数2",[(数据1,数据2),(数据1,数据2)])
示例:
@pytest.mark.parametrize("a,b,c",[(1,3,4),(10,35,45),(22.22,22.22,44.44)])


# 类以Test 开头 
@pytest.mark.parametrize('data',[1,2,3])
class Test_ddt(object):

    def test_001(self,data):
        print(data)

运行结果
image

完整文件:

# -*- coding: utf-8 -*-
#test_pytest.py

import sys
import numpy as np
import time
import datetime
import pytest

    # https://www.cnblogs.com/liudinglong/p/12846986.html

    # 1.模块级:全局的,整个模块开只运行一次,优先于测试用例。

    # 2.类级别:定义在类里面,只针对此类生效。类似unittest的cls装饰器

    # 3.函数级:只对函数生效,类下面的函数不生效。

    # 4.方法级:定义在类里面,每个用例都执行一次

# scope不填,默认函数级别
@pytest.fixture()
def login():
    print("\n请输入账户,密码")

    # 后置
    yield
    print("\n退出登录")


# 普通test_ 和 类同级,看先后顺序 从上到下 执行
def test_001():
    b = 2
    print('\n这是普通函数用例001    >>>>>   不在类中的普通test_开头函数,只运行一次')
    assert b < 3








# 类以Test 开头 
# 对于类中:setup_class >   setup_method    >   setup(暂时没生效)
class Test_api():
    def setup(self):
        print("\n这是方法setup    >>>>>   每条用例执行前执行----------------未执行")

    def teardown(self):
        print("\n这是方法teardown >>>>>   每条用例执行后执行----------------未执行")

    
        
    def setup_class(self):
        #assert 5 < 3
        print("\n 这是类级 Test_api 方法 setup_class  >>>>>   类里面的用例执行前执行,仅一次")

    def teardown_class(self):
        assert 1 < 3
        print("\n这是类级 Test_api 方法 teardown_class  >>>>>   类里面的用例全部结束时执行,仅一次")
 
    def setup_method(self):
        assert 2 < 3
        print("\n这是方法级 Test_api 方法 setup_method  >>>>>   类里面每个用例执行前 都会先执行")
 
    def teardown_method(self):
        assert 1 < 3
        print("\n这是方法级 Test_api 方法 teardown_method  >>>>>   类里面每个用例执行结束后 都会先执行")
    
    def test_cls_001(self):
        a = 1
        print('\n我是 Test_api 类里的方法用例:test_cls_001')       # pytest -s 显示打印内容
        assert a > 0
 
    def test_cls_002(self):
        b = 2
        print('\n我是类里的方法用例:test_cls_002')       # pytest -s 显示打印内容
        assert b < 3




    def aba(self):
        b = 5
        print('\n Test_api 类里,不带test的普通函数,未调用则不运行,不允许则不影响用例结果')
        assert b < 3

    def setup_function(self):
        print('\n 这是函数级 setup_function Test_api 在类里面,不会执行')
        assert 2 < 3

    def setup_module(self):
        print('\n 这是模块级 setup_module ,Test_api 类里面    不会运行。。。')









    #2.pytest中参数化的用法
    #在测试用例的前面加上:
    #   @pytest.mark.parametrize("参数名",列表数据)
    #   参数名:用来接收每一项数据,并作为测试用例的参数。
    #   列表数据:一组测试数据。

    #   @pytest.mark.parametrize("参数1,参数2",[(数据1,数据2),(数据1,数据2)])
    # 示例:
    #   @pytest.mark.parametrize("a,b,c",[(1,3,4),(10,35,45),(22.22,22.22,44.44)])

# 类以Test 开头,会运行 
@pytest.mark.parametrize('data',[1,2,3])
class Test_ddt(object):
 
    def test_001(self,data):
        print('\n这是第二个类 Test_ddt 的方法 test_001  >>>>>   当前运行参数    ' + str(data))



# setup_module&teardown_module 全局,不论位置放哪里,都最高优先级先执行
# 模块级是最大的,全局的,针对.py模块的,你可以认为(setup_module/teardown_module)是global,针对整个py文件,你可以将测试数据初始化和清理数据放到这里。
def setup_module():
    print('\n这是模块级 setup_module   >>>>>   整个py文件运行 前 只运行一次')
    #assert 5 < 3
 
def teardown_module():
    print('\n这是模块级 teardown_module >>>>>   整个py文件运行 后 只运行一次')
    assert 1 < 3


 
# setup_function & teardown_function 不在类中使用
def setup_function():
    print("\n这是函数级 setup_function  >>>>>   不在类中的每条test_开头用例执行前执行")
    assert 2 < 3
 
def teardown_function():
    print("\n这是函数级 teardown_function   >>>>>   不在类中的每条test_开头用例执行后执行")
    assert 1 < 3
 



# test开头的表示一个用例,会触发 setup_function 和  teardown_function
def test_002():
    b = 2
    print('\n这是普通函数用例002    >>>>>   不在类中的普通test_开头函数,只运行一次')
    assert b < 3

def aba():
    b = 2
    print('\n不带test的普通函数,未调用则不运行')
    assert b < 3
 







if __name__ == '__main__':
    #pytest.main()   #直接运行,不显示过程
    #print("over")
    #pytest.main(['-sv'])   #显示逐步运行 和 单个test_ 执行结果
    pytest.main(['-s'])     #显示逐步运行


执行结果:
image

大概层级关系:
image

大佬整理好的笔记:https://www.cnblogs.com/liudinglong/category/1764435.html

posted @ 2022-12-16 15:09  Topi  阅读(96)  评论(0)    收藏  举报