Bootstrap

一篇文章入门Pytest!

目录

一、安装

二、语法

三、执行

四、前后置setup/teardown

五、fixture

六、数据驱动

七、报告

一、安装

需要安装的库

pytest
pytest-html            生成HTML格式的测试报告
pytest-xdist           用例分布式执行,多CPU分发
pytest-ordering        改变用例执行顺序
pytest-rerunfailures   用例失败重跑
allure-pytest          生成allure测试报告
pyYAML                 yaml文件库

安装命令

# 将要安装的库放到 requirements.txt 文件中,然后执行
pip install -r requirements.txt

二、语法

  1. 模块名(用例文件名)必须以test_开头或者_test结尾

  2. 测试类必须以Test开头,且不能有init方法

  3. 测试方法必须以test开头

三、执行

执行命令
  1. 主函数

# test_login.py
import pytest

class TestLogin:
  def test_01(self):
    print("用例1")
    
if __name__ == '__main__':
  pytest.main()		# 执行所有
  
  1. 命令行

# 在命令行中切换到对应目录下后,直接命令行输入
pytest
  1. 读取pytest.ini配置文件

pytest.ini是pytest单元测试框架的核心配置文件,用来改变pytest默认的行为

  1. 一般放在项目的根目录;

  2. 编码必须是ANSI

[pytest]
addopts = -vs
testpaths = ./project
python_files = test*.py
python_classes = Test*
python_functions = test
  • addopts 命令行参数

  • testpaths 测试用例文件夹

  • python_files 搜索文件名

  • python_classes 搜索的测试类名

  • python_functions 搜索的测试方法名的开头

执行命令参数
-s          输入调试信息,如用例中的print
-v          打印信息更详细
文件名(或文件夹)   指定运行文件(或文件夹里文件)用例
-n      分布式运行
--reruns 2   失败重跑(失败重跑2次,加上第一次一共跑了3次)
-x      只要有一个用例报错,测试停止
--maxfail=2     最多出现两个用例报错,测试停止
-k "方法名包含的字符"      根据用例部分字符串执行指定用例

例如

# 主函数
pytest.main(['-vs', 'test_login.py', '-n=2', '--reruns=2'])
# 使用nodeid 执行指定方法
pytest.main(['-vs', './文件名/类名::方法名'])
# 命令行
pytest -vs -n 2 --reruns 2 -k "login "
执行顺序

unittest根据ASCII码;pytest:从上到下

改变执行顺序:

# 使这个用例第一个执行
@pytest.mark.run(order=1)
def test_login():
  print("Done")
分组执行

pytest.ini文件添加:

markers = 
  smoke: 冒烟用例
  login: 登录用例

用例文件:

@pytest.mark.smoke
def test_login2():
  print("Done")

命令行执行命令:

pytest -vs -m "smoke"
# 执行多个分组
pytest -vs -m "smoke or login"
跳过测试用例
# 无条件跳过
@pytest.mark.skip(reason="跳过原因")
# 符合条件跳过
@pytest.mark.skipif(num>3, reason="数量超过3个")

四、前后置

每个用例都有的功能,可以集体提取出来,比如UI自动化的执行前打开浏览器、执行结束后关闭浏览器的操作

# test_login.py
import pytest

class TestLogin:
  
  # 在所有用例之前,只执行一次
  def setup_class(self):
    print("在类执行前执行,比如创建日志对象、创建数据库连接")
  
  # 在每个用例之前都会执行一次
  def setup(self):
    print("每个用例执行前先执行setup:打开浏览器,加载网页")
  
  def test_01(self):
    print("用例1")
  
  def teardown(self):
    print("每个用例执行结束后执行teardown:关闭浏览器")
    
  def teardown_class(self):
    print("类执行结束后,执行一次,比如:销毁日志对象、关闭数据库连接")
    
if __name__ == '__main__':
  pytest.main()		# 执行所有
  

五、fixture

fixture实现部分用例的前后置

@pytest.fixture()参数

  • scope:被标记方法的作用域,function(默认)、class、module、package/session

  • params:参数化

  • autouse:自动执行,默认False

  • ids:使用params参数化时,给每个值设置一个变量名

  • name:给被标记的方法起一个别名【当取了别名以后,原名就不能用了】

import pytest

@pytest.fixture()
def my_fixture():
  print("这是前置方法")
  yield
  print("这是后置方法")

class TestLogin:
  def test01(self):
    print("用例1")
  
  # 这个用例执行前会先执行my_fixture方法
  # 用例执行完后会执行my_fixture的yield
  def test_02(self, my_fixture):
    print("用例2")

如果所有方法有前后置需要,则在fixture里加参数autouse=True用例里也不需要写fixture名调用

@pytest.fixture(autouse=True)
...省略...
class TestLogin:
  def test01(self):
    print("用例1")
params参数化

params支持列表、元组、字典列表、字典元组

import pytest

@pytest.fixture(scope='function', params=["亚索", "凯南", "腕豪"])
def my_fixture(request):
  yield request.param
  print("后置")

class TestLogin:
  def test01(self, my_fixture):
    print("得到参数:", my_fixture)

工程应用

通过conftest.py@pytest.fixture()结合使用,实现全局前后置

conftest.py 文件是单独存放fixture的配置文件,用处是可以在不同的py文件中使用同一个fixture函数,使用时原则上需要将conftest.py文件和用例放到同一层(放在根目录貌似也可以),并且不需要导入。且可以存在多个conftest.py文件(放在不同文件夹中)。调用也可以调用多个:

def test_01(self, my_fixture1, my_fixture2)

上面调用方式就是先调my_fixture1,再调用my_fixture2。

六、数据驱动

@pytest.mark.parametrize(args_name, args_value)
  • args_name:参数名

  • args_value:参数值;有多少参数值,用例就会执行多少次

例1:

import pytest

class TestLogin:
  
  @pytest.mark.parametrize('args', ['北京', '上海', '广州'])
  def test_01(self, args):
    print(args)

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

例2:

import pytest

class TestLogin:
  
  @pytest.mark.parametrize('city, rank', [['北京', '1'], ['上海', '2'], ['广州', '3']])
  def test_01(self, city, rank):
    print(city, rank)

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

七、报告

  1. 下载allure,解压,配置环境变量

  2. 添加执行参数 --alluredir,可以去pytest.ini文件中修改(如下)。也可以在主函数中添加pytest.main(['--alluredir=./temp'])这样生成的json文件会放到temp文件夹中

[pytest]
addopts = -vs --alluredir ./temp
testpaths = ./project
python_files = test*.py
python_classes = Test*
python_functions = test
  1. 在主函数下增加代码

if __name__ == '__main__':
  pytest.main()
  os.system('allure generate ./temp -o ./report --clean')

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走! 

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

;