【二:pytest框架的基本规则与介绍】

一、pytest简介

  • 1.基于python的单元测试框架,它可以和selenium,requests,appium结合实现自动化
    测试。
  • 2.实现用例跳过skip和reruns失败用例重跑。
  • 3.它可以结合allure-pytest插件生成allure报告。
  • 4.很方便和jenkins实现持续集成。
  • 5.有很多强大的插件:
pytest
pip install pytest-ordering  控制用例的执行顺序(重点)
pip install pytest-xdist    分布式并发执行测试用例(重点)
pip install pytest-dependency   控制用例的依赖关系 (了解)
pip install pytest-rerunfailures   失败重跑(了解)
pip install pytest-assume          多重较验(了解)
pip install pytest-random-order  用例随机执行(了解)
pip install pytest-html            测试报告(了解)

放到一个requirements.txt的文档中,如:

pytest
pytest-html
pytest-xdist
pytest-ordering
pytest-rerunfailures
allure-pytest
然后通过:pip install -r requirements.txt(前提条件windows7+python3.7.3+pytest5.4.3 6.2.4)

二、pytest用例管理框架(单元测试框架)

  • 1、主要作用。
    发现测试用例:从多个py文件里面按照一定的规则找到测试用例。
    执行测试用例:按照一定的顺序执行测试用例。并生成结果。
    pytest::默认从上到下,可以装饰器就改变规则。
    unittest:默认安装ASCII顺序去执行。
    判断测试结果:断言。
    生成测试报告:pytest-html,allure报告。

三、pytest的最基本的测试用例的规则

  • 1.模块名必须以test_开头或者_test结尾。
  • 2.测试类必须以Test开头,并且不能带有init方法。
  • 3.测试用例必须以test_开头。
    命令规范:
  • 块名:一般全小写:多个英文之间用_隔开。
  • 类名:类名一般是首字母大写
  • 方法名:一般全小写:多个英文之间用_隔开。

四、运行方式

1.主函数方式。

import pytest

if __name__ == '__main__':
pytest.main()

常见参数:
-v:输出更加详细的信息。比如文件和用例名称等。
-s:输出调试信息。打印信息等。
可以合并成:-vs
–reruns 数字:失败重跑
-x:出现1个失败就停止测试。
–maxfail=2 出现N个失败就终止测试。
–html=report.html 生成html的测试报告
-n:多线程。
-k:运行测试用例名称中包含指定字符串的用例。
pytest.main([‘-vs’,‘-k’,‘weiwei or baili’])
pytest.main([‘-vs’,‘-k’,‘weiwei and baili’])

2、指定模块运行。

if __name__ == '__main__':
pytest.main(['‐vs','testcases/test_api2.py'])

3、指定文件夹

if __name__ == '__main__':
pytest.main(['‐vs','testcases/'])

4.通过node id的方式运行测试用例。

if __name__ == '__main__':
pytest.main(['‐vs','testcases/test_api.py::TestApi::test_product_manage_
weiwei'])

2、命令行方式。

pytest

3.通过pytest.ini的配置文件运行。(不管是命令行还是主函数都会读取这个配置文件)

特别提示:
此文件中最好不要出现中文, 如果有中文的情况下,比如使用notpad++改成GBK的编
码。

[pytest] 用于标记这个文件是pytest的配置文件
addopts = -vs 命令行参数,多个参数之间用空格分隔。 addoptions
testpaths = testcases/ 配置搜索测试用例的范围
python_files = test_*.py 改变默认的文件搜索规则
python_classes = Test* 改变默认的类搜索规则
python_functions = test_* 改变默认的测试用例的搜索规则。
#用例分组
markers =
	smoke:冒烟用例
	productmanage:商品管理模块

如果只想执行冒烟用例的话把文件中的addopts 替换掉
addopts = ‐vs ‐m smoke
此时也许要想用例的方法上面加上@pytest.mark.smoke

五、pytest默认的执行测试用例的顺序

从上到下。
改变默认用例的执行顺序:在用例上加标记:
@pytest.mark.run(order=1)
注意:有order装饰器的优先,相同的从上到下,然后再是没有装饰器的,负数不起作用。

六、跳过测试用例。

粒度:不想这么细。

1.无条件跳过

@pytest.mark.skip(reason="粒度不需要")
@pytest.mark.smoke
def test_baili(self):
print("hello word")

2.有条件跳过

@pytest.mark.skipif(age>2,reason="以后的版本都不执行")
@pytest.mark.smoke
def test_aaa(self):
print("aaa")

七、用例的前后置,固件,夹具,钩子函数

1、实现前后置,固件,夹具,钩子函数

import pytest


def setup_module():
    print("在每个模块之前执行")


def teardown_module():
    print("在每个模块之后执行")


class TestApi:
    def teardown_module(self):
        print("在每个类之前执行,创建日志对象(创建多个日志对象,那么日志会出现重复),创建数据库连接")

    def teardown_class(self):
        print("在每个类之后执行,销毁日志对象,关闭数据库连接")

    def setup(self):
        print("在每个用例之前执行,web自动化:打开浏览器,加载网页,接口自动化:日志开")

    def teardown(self):
        print("在每个用例之后执行,日志结束,关闭浏览器")

    @pytest.mark.productmanage
    def test_product_manage_weiwei(self):
        print("微微老师")

    @pytest.mark.smoke
    def test_baili(self):
        print("百里老师")

    @pytest.mark.smoke
    def test_aaa(self):
        print("aaa")

class TestApi2:
    def test_duo_class(self):
        print("多个类的情况")
if __name__ == '__main__':
    pytest.main(["-vs"])

发现问题:我们没有办法指定哪些用例需要前后置,哪些用例不需要前后置。

2、使用fixture实现部分前后置,配置文件,conftest.py

注意:文件名是固定的

setup/teardown
setup_class/teardown_class

语法:

@pytest.fixture(scope="作用域",params="数据驱动",autouser="自动执行",ids="自定
义参数名称",name="别名")

scope=“作用域”
functioin:在每个方法(测试用例)的前后执行一次。
class:在每个类的前后执行一次。
module:在每个py文件前后执行一次。
package/session:每个package前后执行一次。

1.function级别:在每个函数的前后执行

@pytest.fixture(scope="function")
def execute_sql():
print("执行数据库的验证,查询数据库。")
yield
print("关闭数据库的连接")
调用
1 def test_baili(self,execute_sql):
2 print("百里老师"+execute_sql)

yield和return,都可以返回值,并且返回的值可以在测试用例中获取。
yield生成器,反复一个对象,对象中可以有多个值,yield后面可以接代码。
return 返回一个值,return后面不能接代码。
注意:如果加入autouse=True参数,那么表示自动使用,那么和setup、
teardown功能一致

2.class级别:在每个类的前后执行一次。

3.module级别:在每个模块的前后执行一次。和setup_module和teardown_module效果

一样。

4.package、sesion级别,一般是和connftest.py文件一起使用。

autouse=True 自动调用
params=数据(list,tuple,字典列表,字典元祖)

def read_yaml():
return ['甄子丹','成龙',"吴彦祖"]

@pytest.fixture(scope="function",params=read_yaml())
def execute_sql(request):
print(request.param)
print("执行数据库的验证,查询数据库。")
yield request.param
print("关闭数据库的连接")

这里的params用于传输数据(list,tuple,字典列表,字典元祖),需要在夹
具里面通过request(固定写法)接收,然后通过request.param(固定写法)
获取数据,然后再通过yield把数据返回到测试用例中,然后使用。

3、当fixture的级别为package,session时,那么一般和conftest.py文件一起使用。

  • 1.名称是固定的conftest.py,主要用于单独的存放fixture固件的。
  • 2.级别为package,sesion时,那么可以在多个包甚至多个py文件里面共享前后置。
    举例:登录。
    模块:模块的共性
  • 3.发现conftest.py文件里面的fixture不需要导包可以直接使用。
  • 4.conftest。py文件,可以有多个。
    作用:出现重复日志,初始化一次日志对象。规避日志重复。连接数据库。关闭数据库。
    注意:多个前置同时存在的优先级。
  • 1.conftest.py为函数级别时优先级高于setup/teardown
  • 2.conftest.py为class级别时优先级高于setup_class/teardown_class
  • 3.conftest.py为session级别时优先级高于setup_module/teardown_module

4、conftest.py文件,一般与用例的路径通层级,也可以不是同一级,与执行mian函数或者pytest.ini文件同一级

import pytest
@pytest.fixture(scope="function",autouse=True)
def conn_databases():
    print("连接数据库的操作在里面")
    yield
    print("关闭数据库")

# 自动清除会话,就不需要在方法里面加

@pytest.fixture(scope="session",autouse=True)
def clear_extract():
    # clear_extract_yaml()
    pass


@pytest.fixture()
def get_session():
    # session=requests.session()
    # return session
    pass

你可能感兴趣的:(pytest框架,pytest,python,开发语言)