干货 | 一文搞定 pytest 自动化测试框架(一)_用例


本文节选自霍格沃玆测试学院内部教材,进阶学习,文末加群!


简介

pytest 是一个成熟的全功能 Python 测试工具,可以帮助您编写更好的程序。它与 Python 自带的 Unittest 测试框架类似,但 pytest 使用起来更简洁和高效,并且兼容 unittest 框架。pytest 有以下实用特性:

  • pytest 能够支持简单的单元测试和复杂的功能测试;
  • pytest 本身支持单元测试;
  • 可以结合 Requests 实现接口测试;
  • 结合 Selenium、Appium 实现自动化功能测试;
  • 使用 pytest 结合 Allure 集成到 Jenkins 中可以实现持续集成。工作中一般会使用持续集成来完成代码集成到主干分支之后的回归测试,通过自动化测试的手段来实现产品的快速迭代,同时还能保证产品的高质量。
  • pytest 支持 315 种以上的插件;

参考网站:

  • plugincompat.herokuapp.com/
  • docs.pytest.org/

安装

pip install -U pytest

查看版本

pytest --version

在 Pycharm 中运行 pytest 用例

干货 | 一文搞定 pytest 自动化测试框架(一)_测试用例_02 打开 Pycharm -> 设置 -> Tools -> Python Integrated Tools -> Testing: pytest

首先次设置成 pytest ,需要安装 pytest,可以直接按照这个页面的提示点击“fix”,也可以在 Project interpreter 里面添加 pytest 依赖包。安装完 pytest 之后,编写的符合规则的测试用例都能被识别出来并且标出一个绿色的执行按钮,点击这个按钮也能执行某个方法或者某个类。例如:

干货 | 一文搞定 pytest 自动化测试框架(一)_python_03

Pycharm 设置运行方式为 pytest 之后,用例左侧会显示绿色按钮,可以直接点击这个按钮来执行这条用例。

用例的识别与运行

用例编写规范:

  • 测试文件以​​test_​​​ 开头(以​​_test​​ 结尾也可以)
  • 测试类以​​Test​​ 开头,并且不能带有 init 方法
  • 测试函数以​​test_​​ 开头
  • 断言使用基本的​​assert​​ 即可

创建一个 python 文件,命名以 ​​test_​​​ 开头(或者以 ​​_test​​​ 结尾),创建测试方法以 ​​test_​​​ 开头,测试类需要以 ​​Test​​​ 开头。创建文件名为 ​​test_add.py​​ 文件,代码如下:

#!/usr/bin/env python# -*- coding: utf-8 -*-def add(x, y):    return x + ydef test_add():    assert add(1, 10) == 11    assert add(1, 1) == 2    assert add(1, 99) == 100class TestClass:    def test_one(self):        x = "this"        assert "h" in x    def test_two(self):        x = "hello"        assert hasattr(x, "check")

运行 ​​test_add.py​​​ 文件,在命令行进入到这个文件所在的路径,可以直接使用 pytest 命令运行,pytest 会找当前目录以及递查找子目录下所有的 ​​test_*.py​​​ 或 ​​*_test.py​​ 的文件,把其当作测试文件。在这些文件里,pytest 会收集符合编写规范的函数,类以及方法,当作测试用例并且执行,执行如下:

$ pytest....test_add.py ..F  [100%]....self = <test_cases.test_add.TestClass object at 0x1091810d0>    def test_two(self):        x = "hello">       assert hasattr(x, "check")E       AssertionError: assert FalseE        +  where False = hasattr('hello', 'check')test_add.py:18: AssertionError===================================================== 1 failed, 2 passed in 0.05s ...

结果分析:执行结果中,​​F​​​代表用例未通过(断言错误),​​.​​用例通过。如果有报错会有详细的错误信息。pytest 也支持 Unittest 模式的用例定义。

控制用例的执行顺序

pytest 加载所有的测试用例是乱序的,如果想指定用例的顺序,可以使用 pytest-order 插件,指定用例的执行顺序只需要在测试用例的方法前面加上装饰器 ​​@pytest.mark.run(order=[num])​​ 设置order的对应的num值,它就可以按照 num 的大小顺序来执行。

应用场景:有时运行测试用例需要指定它的顺序,比如有些场景需要先运行完登录,才能执行后续的流程比如购物流程,下单流程,这时就需要指定测试用例的顺序。通过 ​​pytest-ordering​​ 这个插件可以完成用例顺序的指定。

安装

pip install pytest-ordering

案例

创建一个测试文件“test_order.py”,代码如下:

import pytest
class TestPytest(object):
@pytest.mark.run(order=-1)
def test_two(self):
print("test_two,测试用例")
@pytest.mark.run(order=3)
def test_one(self):
print("test_one,测试用例")
@pytest.mark.run(order=1)
def test_three(self):
print("\ntest_three,测试用例")

执行结果,如下查看执行顺序:

省略...plugins: html-2.0.1, rerunfailures-8.0, xdist-1.31.0, \ordering-0.6, forked-1.1.3, allure-pytest-2.8.11, metadata-1.8.0collecting ... collected 3 itemstest_order.py::TestPytest::test_three test_order.py::TestPytest::test_one test_order.py::TestPytest::test_two 省略...

从上面的执行结果可以看出,执行时以 order 的顺序执行:order=1,order=3,order=-1。