前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Pytest编写测试用例(二)

Pytest编写测试用例(二)

作者头像
无涯WuYa
发布2019-09-10 15:18:06
2.4K0
发布2019-09-10 15:18:06
举报

在前面对Pytest做了大概的概述,本节中主要总结Pytest在编写测试用例方面的的知识体系。在实际的工作中,并不是所有的测试用例都是需要执行的,某些测试用例不想被执行,可以添加一个忽略执行,这地方就会使用到装饰器,如果对装饰器不熟悉的同学可以看看我的函数知识体系

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

#!/usr/bin/python3
#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/python3
#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/python3
#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/python3
#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/python3
#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/python3
#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/python3
#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里面,第一个参数也就是测试函数的请求参数,需要一一对应,第二个请求参数是是在里面里面的元组,也是需要与第一个请求参数,这样就是有几组请求参数,也就意味着有几个测试用例,在测试用例的函数中,也是有参数的,也是与上面的需要一一的对应。在某些特殊的场景下,这个功能特别的厉害和强大,比如刚才写的函数来测试该函数的

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-09-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python自动化测试 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档