2022年最新用最简单粗暴的方式讲解:pytest简介,框架基础应用,运行方式,失败用例重跑。直击核心

目录

【pytest简介】

1)pytest写用例很简单,下面是一个简单的例子:

2)pytest的安装

3)pytest的特征、与unittest的区别。

  4)  pytest如何自动识别用例

   5)  pytest中用例的执行顺序

【Pytest测试框架基础--常用功能介绍】

  一、断言

  二、指定顺序执行用例

  三、参数化 

  四、不执行某个测试用例

  五、测试用例前后执行

【pytest基本运行方式】

重点:

pytest.ini配置文件,

参数详解:

【用例失败重跑】

前言

pytest-rerunfailures

装饰器

装饰器在用例上

装饰器在类上

命令行参数


【pytest简介】

pytest是python语言中一款强大的单元测试框架,用来管理和组织测试用例,可应用在单元测试、自动化测试工作中。

unittest也是python语言中一款单元测试框架,但是功能有限,没有pytest灵活。

就像:苹果电脑mac air 和mac pro一样。都是具备同样的功能,但是好用,和更好用。

1)pytest写用例很简单,下面是一个简单的例子:

1 import random
2 
3 
4 def test_demo():
5     assert 7 == random.randint(0,10)

运行结果如下:

============================= test session starts =============================
platform win32 -- Python 3.7.2, pytest-4.6.3, py-1.8.0, pluggy-0.12.0
rootdir: D:\Pychram-Workspace\STUDY_PYTEST
plugins: allure-pytest-2.6.5, html-1.21.1, metadata-1.8.0, rerunfailures-7.0collected 1 item

simple.py F
simple.py:10 (test_demo)
7 != 6

Expected :6
Actual   :7

========================== 1 failed in 0.14 seconds ===========================

2)pytest的安装

     安装命令:pip install pytest

3)pytest的特征、与unittest的区别。

    pytest的特征如下:

    3.1  自动识别测试用例。(unittest当中,需要引入TestSuite,主动加载测试用例。)

    3.2  简单的断言表达:assert 表达式即可。(unittest当中,self.assert*)

    3.3  有测试会话、测试模块、测试类、测试函数级别的fixture。(unittest当中是测试类、测试函数级别的fixture)

    3.4 有非常丰富的插件,目前在600+,比如allure插件。(unittest无)

    3.5 测试用例不需要封装在测试类当中。(unittest中需要自定义类并继承TestCase)

那么pytest是如何自动识别测试用例的呢?我们在编写pytest用例的时候,需要遵守哪些规则呢?

  4)  pytest如何自动识别用例

   识别规则如下:

    1、搜索根目录:默认从当前目录中搜集测试用例,即在哪个目录下运行pytest命令,则从哪个目录当中搜索;

    2、搜索规则:

        1)搜索文件:符合命名规则 test_*.py 或者 *_test.py 的文件

        2)在满足1)的文件中识别用例的规则:

              2.1)以test_开头的函数名;

              2.2)以Test开头的测试类(没有__init__函数)当中,以test_开头的函数

  示例:在D:\pycharm_workspace目录下,创建一个python工程,名为study_pytest。在工程下,创建一个python包,包名为TestCases。

            在包当中,创建一个测试用例文件:test_sample_1.py。文件内容如下:

 1 #!/usr/bin/python3
 2 # -*- coding: utf-8 -*-
 3 # Name: test_sample_1.py
 4 # Author: 简
 5 # Time: 2019/6/27
 6 
 7 # 定义py文件下的测试用例
 8 def test_sample():
 9     print("我是测试用例!")
10 
11 class TestSample:
12 
13     def test_ss(self):
14         print("我也是测试用例!")
15 
16     def hello_pytest(self):
17         print("hi,pytest,我不是用例哦!!")

按照上面定义的搜索规则,需要跳转到工程目录,然后再执行命令:pytest -v 。 执行结果如下:

让我们愉快的加进来第2个测试文件:test_sample_2.py,内容如下:

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Name: test_sample_2
# Author: 简
# Time: 2019/6/27

def add(a,*args):
    sum = a
    for item in args:
        sum += item
    return sum


def test_add_two_number():
    assert 33 == add(11,22)
    assert 55.55 == add(22.22,33.33)


def test_add_three_number():
    assert 101 == add(10,90,1)

 再次运行命令:pytest -v   得到如下结果:

通过多个用例文件的执行,可以看出用例的执行顺序。

   5)  pytest中用例的执行顺序

   原则:先搜索到的py文件中的用例,先执行。在同一py文件当中,按照代码顺序,先搜索到的用例先执行。

【Pytest测试框架基础--常用功能介绍】

  本节主要系统介绍一下Pytest在自动化测试中常用的一些用法,自己编写了一个自动化测试脚本,附在末尾

  一、断言

  学过unittest的同学知道,也是有断言方法的,但是pytest与其有点不同,更为简单。

  判断a是否与b相等  assert a==b

  判断a是否存在b中 assert a in b

  判断a与b不相等 assert a != b

  二、指定顺序执行用例

  测试用例的执行顺序是按照字母顺序执行的,如果想指定其执行顺序,可以使用order用法。

  首先需要安装pytest-ordering库,然后在测试用例上面调用pytest.mark.run(order=1),数字字母越小越先执行。

  @pytest.mark.run(order=1)

  def test_login_account_ok(self):

  self.driver.send_account('account')
      self.driver.send_password('pwd')
      self.driver.btn_click()
      time.sleep(1)
      assert self.driver.get_current_url() == 'http://ygc.com'

  三、参数化 

  在编写测试用例时候,只有某一个值进行改变,可以将此值进行参数化,有多少个值执行多少次。
  如 百度搜索:selenium,自动化,123,空置

1

2

3

4

5

@pytest.mark.parametrize('search_word',['selenium','自动化','123',' '])

  def test_baidu(self,search_word):

    driver.find_element_by_id('kw').clear()

    driver.find_element_by_id('kw').send_keys(search_word)

    driver.find_element_by_id('su').click()

  

  备注:以上测试用例会执行4次,每次百度输入框输入的值分别为selenium,自动化,123,空;测试用例的参数必须要与parameterize里面的参数一致

  如果是需要传入多个参数,比如登录的用户名,密码 可以写为: 

1

2

3

4

5

6

7

8

@pytest.mark.parametrize('account,pwd',[('admin','123456'),('admin','111111'),('admin','')])

  

  def test_login(self,account,pwd):

    driver.find_element_by_id('account').clear()

    driver.find_element_by_id('account').send_keys(account)

    driver.find_element_by_id('pwd').clear()

    driver.find_element_by_id('pwd').send_keys(pwd)

    driver.find_element_by_id('su').click()

  四、不执行某个测试用例

  如果想要某个测试用例不执行,可以加上@pytest.mark.skip,这样某个测试用例就会跳过执行。

  五、测试用例前后执行


  在执行测试用例之前的预置条件以及执行完测试用例的后置条件,比如,在测试网站时候,通常需要先进行登录,测试完之后退出登录,关闭浏览器。
  setup/teardown
  def setup(def):
    print("before testing")

  def teardown(def):
    print("Finish testing")

  每执行一个测试用例,就会执行一次setup,teardown.比如有3个测试用例,那么对应的setup,teardown也会执行三遍。
  如果只想执行一遍,那么可以使用 setup_class,teardown_class,这样只会在测试用例之前执行一次setup_class,所有测试用例执行完成后执行一次teardown_class

【pytest基本运行方式】

1、主函数模式

  1、运行所有:pytest.main()

  2、指定模块:pytest.main(['-vs','xxxx.py'])

  3、指定目录:pytest.main(['-vs','./文件名称'])

  4、pytest支持单个函数写法:pytest.main(['-vs','./文件名/py文件名::类名::方法名'])

  5、

重点:

pytest.ini配置文件,

1、存在位置,项目的根目录

2、编码格式:ANSI,可以使用notepad++修改编码格式

3、作用:改变pytest默认的行为

4、运行规则:不管是主函数模式,或者命令行模式运行,都会去读取整个配置文件

参数详解:

  -s 表示输出调试信息,包括print打印的消息

  -v 表示输出函数名信息,可与-s合用,-vs

  -n 表示分布式,用法-n=2

  --reruns 3 :失败用例重跑

  -k 根据字符串匹配关键字执行方法

  eg:pytest -vs ./文件名 -k 'po(关键字)'

pytest执行用例顺序

  从上到下执行

  @pytest.mark.run(order=3)

【用例失败重跑】

前言

  以前出去面试的时候,经常会遇到一个问题,你的自动化如果根据一些网络原因,环境问题导致的用例失败,怎么进行失败重跑呢?以前用的unittest,没有自动的失败重跑内容,但是强大的pytest中有一个插件功能就能轻松帮助我们解决这个问题。

pytest-rerunfailures

pytest-rerunfailures是属于pytest的插件,通常用来执行用例失败后重新执行。

安装: pip install pytest-rerunfailures 

源码:https://github.com/pytest-dev/pytest-rerunfailres

其中pytest-rerunfailures有2种用法,一种是装饰器的方法,另一种是命令行参数的方法。

装饰器

首先介绍下,如何通过装饰器的方法进行用例失败重跑。

格式: @pytest.mark.flaky(reruns=3, reruns_delay=2)  

使用方法和前面介绍的一些基本相似通过pytest.mark的形式加上flakey方法。我们看到其中有2个参数,其中reruns表示失败后执行几次,reruns_delay表示失败后等待几秒后,在重新执行

装饰器的方法不仅可以加到用例上,也可以加入到类上。

装饰器在用例上

import pytest
import random

class Test01:

    @pytest.mark.flaky(reruns=3, reruns_delay=2)
    def test_01(self):
        a = random.randint(0, 3)
        print('---用例01---')
        print(a)
        assert a == 2

    def test_02(self):
        print('---用例02---')
        assert 1 == 1

if __name__ == '__main__':
    pytest.main(['-vs'])

通过下图可以看到,我们执行用例1一共执行了3次,第一次设置的随机值为1和断言2不一致,进行重新跑,第2次随机值为0和断言2也不一样,第3次的时候断言相同了,用例通过

装饰器在类上

import pytest
import random

@pytest.mark.flaky(reruns=3, reruns_delay=2)
class Test01:

    def test_01(self):
        a = random.randint(0, 2)
        print('---用例01---')
        print('用例01中的a:%s'%a)
        assert a == 2

    def test_02(self):
        c = random.randint(0, 2)
        print('---用例02---')
        print('用例02中的c:%s'%c)
        assert c == 1

if __name__ == '__main__':
    pytest.main(['-vs'])

通过下方执行结果可以很清楚的看到,我们class下的用例都进行了失败重跑。

命令行参数

上述方法介绍了如何通过装饰器的方法进行用例失败重跑,下面介绍如何通过命令行的参数进行失败重跑。

格式: pytest --reruns 3 --reruns-delay 2 或 pytest -vs --reruns=3 --reruns-delay=2 

参数详解:其中reruns空格3 表示失败重新运行3次,reruns-delay空格2 表示重新执行需要等待2秒。这里也可以使用等于来进行表示

import pytest
import random

class Test01:

    def test_01(self):
        a = random.randint(0, 2)
        print('---用例01---')
        print('用例01中的a:%s'%a)
        assert a == 2

    def test_02(self):
        c = random.randint(0, 2)
        print('---用例02---')
        print('用例02中的c:%s'%c)
        assert c == 1

if __name__ == '__main__':
    pytest.main(['-vs']

通过下图执行结果可以看出来,失败重跑已经生效。

注意事项:装饰器的方法和命令行的方法不能一起使用,不然的话会报错!!!

简单的通过实例介绍了用例失败重跑的两种方法,具体哪种方法好用,这个要看个人的喜好了。不过安静还是推荐使用命令行参数。

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值