Selenium3自动化测试【39】单元测试Pytest

前言

pytest测试框架也是主流的一个测试框架,推荐使用该框架,对比unnitest框架来说,其效率更高。前面的文章讲解了,如何使用pytest,这篇文章一起来看下如何针对pytest的测试用例进行控制。

本篇文章是《Selenium3自动化测试【38】单元测试Pytest》的后续,建议连续阅读,效果更佳。

1. 测试用例的运行控制

Pytest执行用例的方式,不单单是Pytest这一种方式,Pytest提供了3种运行方式执行测试用例。

  • pytest(一般采用该种方式);
  • pytest test.py或pytest test.py;
  • python –m pytest。

在pytestDemo目录下,新创建一个Demo_test.py文件,代码如下:

# 乘法,返回a*b的值
def multi(a,b):
    return a*b

# 除法,返回a/b的值
def divide(a,b):
    return a/b

class TestClass:
    def test_multi(self):
        assert multi(3, 3) == 6

    def test_divide(self):
        assert divide(3, 2) == 4

1.1 方式1:pytest

格式为:【pytest 文件名/】或进入pytestDemo目录下,运行pytest,执行某个目录下所有的用例,结果如下,可观察到Demo_test.py与test_demo.py两个测试文件均被运行。

E:\pytestDemo>pytest
=================== test session starts =================================
platform win32 -- Python 3.7.5, pytest-5.4.1, py-1.8.1, pluggy-0.13.1
rootdir: E:\pytestDemo
collected 4 items

Demo_test.py FF                                                                                                  [ 50%]
test_demo.py ..                                                                                                  [100%]

======================= FAILURES ================================
_______________________ TestClass.test_multi _________________________

self = <pytestDemo.Demo_test.TestClass object at 0x00000190540EAA48>

    def test_multi(self):
>       assert multi(3, 3) == 6
E       assert 9 == 6
E        +  where 9 = multi(3, 3)

Demo_test.py:25: AssertionError
_________________ TestClass.test_divide _________________________

self = <pytestDemo.Demo_test.TestClass object at 0x00000190540DF208>

    def test_divide(self):
>       assert divide(3, 2) == 4
E       assert 1.5 == 4
E        +  where 1.5 = divide(3, 2)

Demo_test.py:28: AssertionError
==================== short test summary info ==========================
FAILED Demo_test.py::TestClass::test_multi - assert 9 == 6
FAILED Demo_test.py::TestClass::test_divide - assert 1.5 == 4
=================== 2 failed, 2 passed in 0.07s =======================

1.2 方式2:pytest test_*.py

执行某一个py文件下用例【pytest 脚本名称.py】,操作步骤及运行结果如下,可观察到仅仅运行了Demo_test.py文件,而test_demo.py并未被运行。

E:\pytestDemo>pytest Demo_test.py
========= test session starts ==================================
platform win32 -- Python 3.7.5, pytest-5.4.1, py-1.8.1, pluggy-0.13.1
rootdir: E:\pytestDemo
collected 2 items
Demo_test.py FF                                                                                                  [100%]

========================= FAILURES ================================
_____ TestClass.test_multi _________________________
self = <pytestDemo.Demo_test.TestClass object at 0x000001B64767ED48>
    def test_multi(self):
>       assert multi(3, 3) == 6
E       assert 9 == 6
E        +  where 9 = multi(3, 3)

Demo_test.py:25: AssertionError
________________________TestClass.test_divide ____________________________
self = <pytestDemo.Demo_test.TestClass object at 0x000001B64767EF48>
    def test_divide(self):
>       assert divide(3, 2) == 4
E       assert 1.5 == 4
E        +  where 1.5 = divide(3, 2)

Demo_test.py:28: AssertionError
===================== short test summary info =========================
FAILED Demo_test.py::TestClass::test_multi - assert 9 == 6
FAILED Demo_test.py::TestClass::test_divide - assert 1.5 == 4
================ 2 failed in 0.10s ===================

1.3 方式3:python -m pytest

通过python -m pytest运行当前目录下的所有测试用例文件。

E:\pytestDemo>python -m pytest
================test session starts ====================================
platform win32 -- Python 3.7.5, pytest-5.4.1, py-1.8.1, pluggy-0.13.1
rootdir: E:\pytestDemo
collected 4 items
Demo_test.py FF                                                                                                  [ 50%]
test_demo.py ..                                                                                                  [100%]
=====================FAILURES ==========================
__________ TestClass.test_multi ____________________________________
self = <pytestDemo.Demo_test.TestClass object at 0x0000019554B8AE48>
    def test_multi(self):
>       assert multi(3, 3) == 6
E       assert 9 == 6
E        +  where 9 = multi(3, 3)

Demo_test.py:25: AssertionError
__________________TestClass.test_divide ____________________

self = <pytestDemo.Demo_test.TestClass object at 0x0000019554B4A708>
    def test_divide(self):
>       assert divide(3, 2) == 4
E       assert 1.5 == 4
E        +  where 1.5 = divide(3, 2)
Demo_test.py:28: AssertionError
===================== short test summary info ====================
FAILED Demo_test.py::TestClass::test_multi - assert 9 == 6
FAILED Demo_test.py::TestClass::test_divide - assert 1.5 == 4
=================== 2 failed, 2 passed in 0.14s ====================

1.4 节点运行

通过节点运行方式可运行某个.py文件(模块)里的某个函数或某个方法,如仅仅运行Demo_test.py文件中的test_multi方法,而Demo_test.py中的test_divide不要运行。
通过“pytest Demo_test.py::TestClass::test_multi”运行后,在结果中可观察到仅仅运行了test_multi方法。

E:\pytestDemo>pytest Demo_test.py::TestClass::test_multi
=================== test session starts ===================
platform win32 -- Python 3.7.5, pytest-5.4.1, py-1.8.1, pluggy-0.13.1
rootdir: E:\pytestDemo
collected 1 item

Demo_test.py F                                                                                                   [100%]

======================== FAILURES ======================
_____________________TestClass.test_multi _________________________
self = <pytestDemo.Demo_test.TestClass object at 0x0000015DDF3E64C8>
    def test_multi(self):
>       assert multi(3, 3) == 6
E       assert 9 == 6
E        +  where 9 = multi(3, 3)

Demo_test.py:25: AssertionError
=================== short test summary info =============================
FAILED Demo_test.py::TestClass::test_multi - assert 9 == 6
==================== 1 failed in 0.05s ===================

1.5 遇到错误停止测试

Demo_test.py文件中的test_multi与 test_divide两个方法运行断言,均会执行失败。通过pytest -x Demo_test.py执行过程中,当遇到第一个方法或函数执行无法通过,则将停止运行,后面的方法或函数将不被执行,如下所示:

E:\pytestDemo>pytest -x Demo_test.py
====================== test session starts ====================
platform win32 -- Python 3.7.5, pytest-5.4.1, py-1.8.1, pluggy-0.13.1
rootdir: E:\pytestDemo
collected 2 items
Demo_test.py F
=================================== FAILURES =====================
_______________ TestClass.test_multi _____________________________
self = <pytestDemo.Demo_test.TestClass object at 0x00000208030AFD48>
    def test_multi(self):
>       assert multi(3, 3) == 6
E       assert 9 == 6
E        +  where 9 = multi(3, 3)

Demo_test.py:25: AssertionError
============================== short test summary info ==============
FAILED Demo_test.py::TestClass::test_multi - assert 9 == 6
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! stopping after 1 failures !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
============================= 1 failed in 0.06s =========================

pytest测试用例编写非常简单,pytest可以在不同的函数、包中发现用例,但pytest有如下约束。

2. 编译器中配置pytest

Python默认自带的单元测试框架是unittest,因此在PyCharm编译器中默认的单元测试框架一般是unittest。如果想修改当前工程的单元测试框架,可通过修改PyCharm默认的【test runner】来指定为单元测试框架pytest。
修改路径file->Setting->Tools->python Integrated Tools>Default test runner-> pytest,如图所示。

图 PyTest的设定

【测试测试课程】....

《全栈测试系列视频》课程






图书京东、当当有售

京东:https://item.jd.com/12784287.html
当当:http://product.dangdang.com/29177828.html)!

posted @ 2022-07-23 17:57  BlaLeo  阅读(243)  评论(0编辑  收藏  举报