关于软件测试:干货-一文搞定-pytest-自动化测试框架二

4次阅读

共计 4342 个字符,预计需要花费 11 分钟才能阅读完成。

在上一篇文章中分享了 pytest 的根本用法,本文进一步介绍 pytest 的其余实用个性和进阶技巧。
pytest fixtures
pytest 中能够应用 @pytest.fixture 装璜器来装璜一个办法,被装璜办法的办法名能够作为一个参数传入到测试方法中。能够应用这种形式来实现测试之前的初始化,也能够返回数据给测试函数。
通常应用 setup 和 teardown 来进行资源的初始化。如果有这样一个场景,测试用例 1 须要依赖登录性能,测试用例 2 不须要登录性能,测试用例 3 须要登录性能。这种场景 setup,teardown 无奈实现,能够应用 pytest fixture 性能,在办法后面加个 @pytest.fixture 装璜器,加了这个装璜器的办法能够以参数的模式传入到办法外面执行。
例如在登录的办法,加上 @pytest.fixture 这个装璜器后,将这个用例办法名以参数的模式传到办法里,这个办法就会先执行这个登录办法,再去执行本身的用例步骤,如果没有传入这个登录办法,就不执行登录操作,间接执行已有的步骤。
创立一个文件名为“test_fixture.py”,代码如下:
在下面的代码中,测试用例 test_case1 和 test_case3 别离减少了 login 办法名作为参数,pytest 会发现并调用 @pytest.fixture 标记的 login 性能,运行测试后果如下:
从下面的后果能够看出,test_case1 和 test_case3 运行之前执行了 login 办法,test_case2 没有执行这个办法。
fixture 外面有一个参数 scope,通过 scope 能够管制 fixture 的作用范畴,依据作用范畴大小划分:session> module> class> function,具体作用范畴如下:

  • function 函数或者办法级别都会被调用
  • class 类级别调用一次
  • module 模块级别调用一次
  • session 是多个文件调用一次 (能够跨.py 文件调用,每个.py 文件就是 module)
    例如整个模块有多条测试用例,须要在全副用例执行之前关上浏览器,全副执行完之后去敞开浏览器,关上和敞开操作只执行一次,如果每次都从新执行关上操作,会十分占用系统资源。这种场景除了 setup_module,teardown_module 能够实现, 还能够通过设置模块级别的 fixture 装璜器 (@pytest.fixture(scope=”module”)) 来实现。
    scope=’module’
    fixture 参数 scope=’module’,module 作用是整个模块都会失效。
    创立文件名为 test_fixture_scope.py,代码如下:
    代码解析:
    @pytest.fixture() 如果不写参数,参数默认 scope=’function’。当 scope=’module’ 时,在以后 .py 脚本外面所有的用例开始前只执行一次。scope 奇妙与 yield 组合应用,相当于 setup 和 teardown 办法。还能够应用 @pytest.mark.usefixtures 装璜器,传入前置函数名作为参数。
    运行后果如下:
    从下面运行后果能够看出,scope=”module” 与 yield 联合,相当于 setup_module 和 teardown_module 办法。整个模块运行之前调用了 open()办法中 yield 后面的打印输出“关上浏览器”,整个运行之后调用了 yield 前面的打印语句“执行 teardown !”与“敞开浏览器”。yield 来唤醒 teardown 的执行,如果用例出现异常,不影响 yield 前面的 teardown 执行。能够应用 @pytest.mark.usefixtures 装璜器来进行办法的传入。
    fixture scope 为 session 级别是能够跨 .py 模块调用的,也就是当咱们有多个 .py 文件的用例时,如果多个用例只需调用一次 fixture,能够将 scope=’session’,并且写到 conftest.py 文件里。写到 conftest.py 文件能够全局调用这外面的办法。应用的时候不须要导入 conftest.py 这个文件。应用 conftest.py 的规定:
    1.conftest.py 这个文件名是固定的,不能够更改。
    2.conftest.py 与运行用例在同一个包下,并且该包中有 init.py 文件
    3. 应用的时候不须要导入 conftest.py,pytest 会自动识别到这个文件
    4. 放到我的项目的根目录下能够全局调用,放到某个 package 下,就在这个 package 内无效。
    案例
    在运行整个我的项目下的所有的用例,只执行一次关上浏览器。执行完所有的用例之后再执行敞开浏览器,能够在这个我的项目下创立一个 conftest.py 文件,将关上浏览器操作的办法放在这个文件下,并增加一个装璜器 @pytest.fixture(scope=”session”),就可能实现整个我的项目所有测试用例的浏览器复用,案例目录构造如下:

    创立目录 test_scope,并在目录下创立三个文件 conftest.py,test_scope1.py 和 test_scope2.py。
    conftest.py 文件定义了公共办法,pytest 会主动读取 conftest.py 定义的办法,代码如下:
    创立 test_scope1.py 文件,代码如下:
    创立文件“test_scope2.py”,代码如下:
    关上 cmd,进入目录 test_scope/,执行如下命令:
    或者
    执行后果如下:
    执行过程中 pytest 会自动识别当前目录的 conftest.py,不须要导入间接援用外面的办法配置。利用到整个目录下的所有调用这外面的办法中执行。conftest.py 与运行的用例要在同一个 pakage 下,并且这个包下有 __init__.py 文件
    如果每条测试用例都须要增加 fixture 性能,则须要在每一要用例办法外面传入这个 fixture 的名字,这里就能够在装璜器外面增加一个参数 autouse=’true’,它会主动利用到所有的测试方法中,只是这里没有方法返回值给测试用例。
    应用办法,在办法后面加上装璜器,如下:
    @pytest.fixture 里设置 autouse 参数值为 true(默认 false),每个测试函数都会主动调用这个前置函数。
    创立文件名为“test_autouse.py”, 代码如下:
    执行下面这个测试文件,后果如下:
    从下面的运行后果能够看出,在办法 myfixture() 下面增加了装璜器 @pytest.fixture(autouse=”true”),测试用例毋庸传入这个 fixture 的名字,它会主动在每条用例之前执行这个 fixture。
    测试过程中须要大量的测试数据,如果每条测试数据都编写一条测试用例,用例数量将是十分宠大的。个别咱们在测试过程中会将测试用到的数据以参数的模式传入到测试用例中,并为每条测试数据生成一个测试后果数据。
    这时候能够应用 fixture 的参数化性能,在 fixture 办法加上装璜器 @pytest.fixture(params=[1,2,3]),就会传入三个数据 1、2、3,别离将这三个数据传入到用例当中。这里能够传入的数据是个列表。传入的数据须要应用一个固定的参数名 request 来接管。
    创立文件名为“test_params.py”,代码如下:
    运行后果如下:
    从运行后果能够看出,对于 params 外面的每个值,fixture 都会去调用执行一次,应用 request.param 来承受用例参数化的数据,并且为每一个测试数据生成一个测试后果。在测试工作中应用这种参数化的形式,会缩小大量的代码量,并且便于浏览与保护。
    如果我的项目中有测试用例 1000 条,一条测试用例须要执行 1 分钟,一个测试人员须要 1000 分钟能力实现一轮回归测试。通常咱们会用人力老本换取工夫老本,加几个人一起执行,工夫就会缩短。如果 10 人一起执行只须要 100 分钟,这就是一种并行测试,分布式的场景。
    pytest-xdist 是 pytest 分布式执行插件,能够多个 CPU 或主机执行,这款插件容许用户将测试并发执行(过程级并发), 插件是动静决定测试用例执行程序的,为了保障各个测试能在各个独立线程里正确的执行,应该保障测试用例的独立性(这也合乎测试用例设计的最佳实际)。
    装置
    多个 CPU 并行执行用例,须要在 pytest 前面增加 -n 参数,如果参数为 auto,会自动检测零碎的 CPU 数目。如果参数为数字,则指定运行测试的处理器过程数。
    案例
    某个我的项目有 200 条测试用例,每条测试用例之间没有关联关系,互不影响。这 200 条测试用例须要在 1 小时之内测试实现,能够加个 - n 参数,应用多 CPU 并行测试。运行办法:
    进入到我的项目目录下,执行 pytest 能够将我的项目目录下所有测试用例辨认进去并且运行,加上 -n 参数,能够指定 4 个 CPU 并发执行。大量的测试用例并发执行提速非常明显。
    测试报告通常在我的项目中尤为重要,报告能够体现测试人员的工作量,开发人员能够从测试报告中理解缺点的状况,因而测试报告在测试过程中的位置至关重要,测试报告为纠正软件存在的品质问题提供根据,为软件验收和交付打下基础。测试报告依据内容的侧重点,能够分为“版本测试报告”和“总结测试报告”。执行完 pytest 测试用例,能够应用 pytest-HTML 插件生成 HTML 格局的测试报告。
    装置
    执行办法
    联合 pytest-xdist 应用
    生成测试报告
    如下图:

    生成的测试报告最终是 HTML 格局,报告内容包含题目、运行工夫、环境、汇总后果以及用例的通过个数、跳过个数、失败个数、谬误个数,冀望失败个数、不冀望通过个数、从新运行个数、以及谬误的具体展现信息。报告会生成在运行脚本的同一门路,须要指定门路增加 –html=path/to/html/report.html 这个参数配置报告的门路。如果不增加 –self-contained-html 这个参数,生成报告的 CSS 文件是独立的,分享的时候容易千万数据失落。
    编写代码时,咱们常常会做出一些假如,断言就是用于在代码中捕获这些假如。断言示意为一些布尔表达式,测试人员通常会加一些断言来判定两头过程的正确性。断言反对显示最常见的子表达式的值,包含调用,属性,比拟以及二元和一元运算符。Python 应用 assert(断言)用于判断一个表达式,在表达式条件为 false 的时候触发异样。
    应用办法:
    案例如下:
    如果没有断言,没有方法断定用例中每一个测试步骤后果的正确性。在我的项目中适当的应用断言,来对代码的构造、属性、性能、安全性等场景查看与验证。
    以上,更多 Python 测试开发实战进阶技能,举荐学习《Python 测试开发实战进阶》课程。

正文完
 0