在前面对Pytest做了大概的概述,本节中主要总结Pytest在编写测试用例方面的的知识体系。

在实际的工作中,并不是所有的测试用例都是需要执行的,某些测试用例不想被执行,可以添加

一个忽略执行,这地方就会使用到装饰器,如果对装饰器不熟悉的同学可以看看我的函数知识体系

里面对装饰器的总结和概述。见如下的案例代码:

复制代码

#!/usr/bin/env python
# -*-coding:utf-8 -*-

import  pytest

@pytest.mark.login
def test_login_001():
    pass

@pytest.mark.login
def test_login_002():
    pass

@pytest.mark.skip(reason='忽略执行该测试用例')
def test_login_003():
    pass

复制代码

 执行命令pytest -rs,就能够显示出忽略执行的测试用例的详细信息,见如下的截图信息:

如果参数没有-rs,就不会显示出详细的忽略执行的信息,见截图:

      对测试用例进行分组执行,使用到的命令会有-m,也会有-k,见案例的源代码:

复制代码

#!/usr/bin/env python
# -*-coding:utf-8 -*-

import  pytest

@pytest.mark.login
def test_login_001():
    pass

@pytest.mark.login
def test_login_002():
    pass

@pytest.mark.user
def test_user_001():
    pass

@pytest.mark.user
def test_user_002():
    pass

复制代码

 先使用-k测试搜索的方式来执行,执行的命令为:pytest -k "login or user",见执行结果输出信息:

这里我们使用-m的命令来执行,执行的命令为:pytest -m login 

可以看到只会执行login分组的测试用例,而user分组的测试用例并不会被执行。当然有人可能会有疑问,想执行多个分组的怎么

办了?简单,实用-k测试搜索的方式进行。

     下面来看测试用例的执行结果,测试子集的执行,先来看目前项目的结构目录:

 这里执行tests包下所有的测试用例,执行的命令为:pytest  tests/ --tb=no,见执行的结果截图:

当然-v 显示出详细的信息,--duration显示出测试用例执行的耗时时间从长到短的排序,见如下的结果截图信息:

     在前面的案例代码中,都是关于函数式的编程方式,这里主要介绍面向对象的编程方式的应用,废话还是不多说,直接

上案例的代码:

复制代码

#!/usr/bin/env python
# -*-coding:utf-8 -*-


import  pytest


class TestXunit(object):
    def test_001(self):
        pass
    
    def test_002(self):
        pass

复制代码

 先单独执行该模块里面所有的测试用例,见执行的结果截图信息:

下来想执行一个测试类里面的具体测试用例,比如执行test_001的测试用例,执行的命令为:pytest -v 测试模块::测试类::测试用例,

见如下的结果截图信息:

     在UI自动化测试中,selenium是一个主流的测试框架,在pytest也是支持对selenium的操作,需要安装第三方的库,安装

的命令为:

                                                           pip  install pytest-selenium

在这里特别是强调,在一个测试函数或者是一个测试方法中,selenium是固定参数,指的是driver,对selenium框架熟悉的

同学知道,要操作浏览器,首先需要对webdriver进行实例化后,可以对浏览器进行操作。还是先来看简单的案例应用,打开

百度,断言百度的title,见案例的代码:

复制代码

#!/usr/bin/env python
# -*-coding:utf-8 -*-

import  pytest

def test_baidu_title(selenium):
    selenium.get('http://www.baidu.com')
    assert  selenium.title=='百度一下,你就知道'

复制代码

在执行命令的时候,需要指定驱动driver以及要执行的浏览器,命令为:

pytest  测试模块   --driver   Chrome(指定测试的浏览器),见执行结果的截图信息:

浏览器会自动打开,然后做业务操作,然后自动关闭,所以中间省去了打开浏览器和关闭浏览器的过程,编写测试类,完善下

这部分的测试场景,见案例的代码:

复制代码

#!/usr/bin/env python
# -*-coding:utf-8 -*-

import  pytest

class TestSelenium(object):
    def test_baidu_title(self,selenium):
        selenium.get('http://www.baidu.com')
        assert selenium.title == '百度一下,你就知道'

    def test_baidu_url(self,selenium):
        selenium.get('http://www.baidu.com')
        assert  selenium.current_url=='https://www.baidu.com/'

    def test_baidu_so(self,selenium):
        '''获取搜索的关键字然后断言'''
        selenium.get('http://www.baidu.com')
        so=selenium.find_element_by_id('kw')
        so.send_keys('无涯课堂')
        assert  so.get_attribute('value')=='无涯课堂'

复制代码

 执行的命令和前面的一样,其实使用pytest-selenium完全可以页面对象设计模式,把我很早期的代码

做一个简单的修改就可以了,这里解释了,后面写文章解释。见执行如上的代码后,输出的结果信息截图:

 这里特别的强调,都多少个测试用例,浏览器打开关闭多少次。这个库很有意思的,后面我会结合框架写一套代码

让大家玩。

     还有一种一种需求是按测试名称来执行的,也就是依据名称来指定测试集合,还是以具体的案例为实例来说明这

部分的应用,见案例源码:

复制代码

#!/usr/bin/env python
# -*-coding:utf-8 -*-


import  pytest

def test_api_001():
    pass

def test_api_002():
    pass

复制代码

这里使用到的命令是-k,它可以测试搜索到api的测试用例并且执行,见执行命令后输出的结果信息:

就会找到_api的测试用例并且会被执行。-k这个命令参数感觉特别的好使用。

    下来来看参数化的部分,学习过ddt框架的同学可能知道,ddt它在相同的测试步骤中,可以实现一个测试用例的代码

依据请求参数的不同测试多个测试场景,关于这部分我在UI里面讲的也是比较多,在接口里面讲的基本很少,可以说是

没有。这里主要来看pytest中参数化的应用,比如有个函数,是两个数相加,需要测试的是两个数相加后的结果信息,还

是直接上代码,见案例源码:

复制代码

#!/usr/bin/env python
# -*-coding:utf-8 -*-


import  pytest

def add(a,b):
    return a+b


@pytest.mark.parametrize('a,b,result',[
    (1,1,2),
    (2,2,4),
    (3,3,6),
    (4,4,8),
    (5,5,10)])
def test_add(a,b,result):
    assert  add(a,b)==result

复制代码

首先我来解释下上面的代码,装饰器parameterize里面,第一个参数也就是测试函数的请求参数,需要一一对应,第二个请求参数是

是在里面里面的元组,也是需要与第一个请求参数,这样就是有几组请求参数,也就意味着有几个测试用例,在测试用例的函数中,也

是有参数的,也是与上面的需要一一的对应。在某些特殊的场景下,这个功能特别的厉害和强大,比如刚才写的函数来测试该函数的

功能,执行该测试代码,见执行后的结果信息:

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐