Python自动化测试实战篇(3)优化unittest批量自动化接口测试代码,ddt驱动+yaml实现用例调用,输出HTMLTestRunner测试报告

有目标就不怕路远。年轻人.无论你现在身在何方.重要的是你将要向何处去。只有明确的目标才能助你成功。没有目标的航船.任何方向的风对他来说都是逆风。因此,再遥远的旅程,只要有目标.就不怕路远。没有目标,哪来的劲头?一车尔尼雷夫斯基

导读:本篇文章讲解 Python自动化测试实战篇(3)优化unittest批量自动化接口测试代码,ddt驱动+yaml实现用例调用,输出HTMLTestRunner测试报告,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

在这里插入图片描述这些是之前的文章,里面有一些基础的知识点在前面由于前面已经有写过,所以这一篇就不再详细对之前的内容进行描述
Python自动化测试实战篇(1)读取xlsx中账户密码,unittest框架实现通过requests接口post登录网站请求,JSON判断登录是否成功

Python自动化测试实战篇(2)unittest实现批量接口测试,并用HTMLTestRunner输出测试报告

源码已上传,有需要的可以自行下载
Python自动化测试实战篇(3)优化unittest批量自动化接口测试代码,ddt驱动+yaml实现用例调用,输出测试报告
本篇主要就是对之前的代码进行优化,虽然之前已经实现了批量的用例测试,但是由于实在是过于繁琐和非常多的重复代码,虽然像接口地址和header这些重复性的内容可以放在另一个地方用于储存,但是还需要写大量重复的内容。
在这里插入图片描述

所以本篇主要就是结合ddt+yaml来进行对这些重复的而又繁杂的代码进行优化,将用例需要测试的内容封装起来放到外部,实现可重复使用

ddt的使用在于减少重复性的接口测试请求,为了更方便管理测试用例,所以还需要将用例存放在yaml中,这样对于大量的测试用例管理来说是非常方便的,本次用于登录测试的接口依然还是之前的cms系统,这一次将测试用例再次增加10条用于测试用户账户,具体如图
在这里插入图片描述

1.创建yaml文件

yaml语法为:
冒号+空格 就是字典里面的key和value,
冒号+冒号 代表是一个对象,这里的冒号可以为空,
杠(-)加数据代表列表,
杠杠(–)加数据代表列表里面的列表
创建一个名字为lojump的yaml文件
将需要测试用例的信息放进去,一共是20条

- user: admin
  pwd: 123456
  tst: 't01调用成功,登陆成功返回所有的登录信息'
- user: admin
  pwd: 123Aa
  tst: 't02调用成功,返回登录失败信息'
- user: admin
  pwd: 123456@@
  tst: 't03调用成功,返回登录失败信息'
- user: admin
  pwd: ''
  tst: 't04调用成功,返回登录密码不能为空'
- user: admin
  pwd: '/.;'
  tst: 't05调用成功,返回登录失败信息'
- user: admin
  pwd: '一二三四五六'
  tst: 't06调用成功,返回登录失败信息'
- user: admin
  pwd: 'abcdefg'
  tst: 't07调用成功,返回登录失败信息'
- user: admin
  pwd: 'いち'
  tst: 't08调用成功,返回登录失败信息'
- user: admin
  pwd: '하나 둘 셋 넷 다섯 여섯'
  tst: 't009调用成功,返回登录失败信息'
- user: admin
  pwd: 'адзін два тры чатыры пяць шэсць'
  tst: 't10调用成功,返回登录密码不能为空'
- user: 123456
  pwd: 123456
  tst: 't11调用成功,返回登录密码不能为空'
- user: 123Aa
  pwd: ''
  tst: 't12调用成功,返回登录失败信息'
- user: 123456@@
  pwd: 123456
  tst: 't13调用成功,返回登录失败信息'
- user: 【】
  pwd: 123456
  tst: 't14调用成功,返回登录失败信息'
- user: /.;
  pwd: 123456
  tst: 't15调用成功,返回登录失败信息'
- user: 一二三四五六
  pwd: 123456
  tst: 't16调用成功,返回登录失败信息'
- user: abcdefg
  pwd: 123456
  tst: 't17调用成功,返回登录失败信息'
- user: いち
  pwd: 123456
  tst: 't18调用成功,返回登录失败信息'
- user: 하나 둘 셋 넷 다섯 여섯
  pwd: 123456
  tst: 't19调用成功,返回登录失败信息'
- user: адзін два тры чатыры пяць шэсць
  pwd: 123456
  tst: 't20调用成功,返回登录失败信息'

2.实现unittest+ddt对yaml里面的用例进行测试

1.导入ddt包

from ddt import ddt,data,unpack #导入数据驱动

2.class类上加上修饰符@ddt,

在这里插入图片描述

3.导入全部包

import yaml 
import os 
import unittest,requests
from ddt import ddt,data,unpack 

4.读取yaml文件

f=open(os.path.join('D:\pythonpj\pytest\lojump.yaml'),'r',encoding='utf-8')
ts_et=yaml.safe_load(f)

5.设置固定的url和headers

url = 'http://192.168.52.129:8080/cms/manage/loginJump.do'
headers = {'Content-Type': 'application/x-www-form-urlencoded'}

6.定义一个测试用例

@ddt
class lg(unittest.TestCase):
    @data(*ts_et)
    @unpack
    def test_logjump(self,**dict):#定义一个测试用例
        reps=requests.post(url=url,headers=headers,
                        data={'userAccount':dict['userAccount'],
                        'loginPwd': dict['loginPwd']})
        print(reps.text)
if __name__ == '__main__':
    unittest.main()

7.完整代码

目前来看代码相对简短了很多,从之前的128行代码缩短到目前的18行代码,如果将其他固定的如url和headers封装到其他文件里面去的话代码会更少

import yaml #导入yaml模块获取yaml文件值
import os #导入路径拼接
import unittest,requests
from ddt import ddt,data,unpack #导入数据驱动
f=open(os.path.join('D:\pythonpj\pytest\lojump.yaml'),'r',encoding='utf-8')
ts_et=yaml.safe_load(f)
url = 'http://192.168.52.129:8080/cms/manage/loginJump.do'
headers = {'Content-Type': 'application/x-www-form-urlencoded'}
@ddt
class lg(unittest.TestCase):
    @data(*ts_et)
    @unpack
    def test_logjump(self,**dict):#定义一个测试用例
        reps=requests.post(url=url,headers=headers,
                        data={'userAccount':dict['userAccount'],
                        'loginPwd': dict['loginPwd']})
        print(reps.text)
if __name__ == '__main__':
    unittest.main()

返回的结果
在这里插入图片描述

3.输出HTMLTestRunner测试报告

1.确定本地路径

当然你也可以直接写一个绝对地址路径也没关系

a1_path = os.path.abspath(os.path.dirname(__file__))

2.生成时间戳

import time
t_ime = time.strftime('%Y-%m-%H-%M-%S')

3.拼接时间和要生成的本地文件

  report_path = os.path.join(a1_path, t_ime+'测试报告.html')

4.执行搜索本地用例

带*表示g之后的都执行搜索

discre = unittest.defaultTestLoader.discover(start_dir=a1_path,pattern='g*.py')

5.写入本地文件

p = open(report_path,'wb')

6.执行生成HTMLTestRunner测试报告

run = HTMLTestRunner(stream=p,title='CMS总计报告',description='执行情况',tester='you')
    run.run(discre)

7.最后在if name == ‘main’:中执行

logjum()的位置一定要在unittest.main之前才能执行成功

if __name__ == '__main__':
    logjum()
    unittest.main()

8.最终生成的HTMLTestRunner测试报告结果

在这里插入图片描述
可以正常显示我们所需要的测试结果
在这里插入图片描述

9.完整代码

import yaml #导入yaml模块获取yaml文件值
import os #导入路径拼接
import unittest,requests
from ddt import ddt,data,unpack #导入数据驱动
from HTMLTestRunner3_New import HTMLTestRunner
import time
f=open(os.path.join('D:\pythonpj\pytest\lojump.yaml'),'r',encoding='utf-8')
ts_et=yaml.safe_load(f)
url = 'http://192.168.52.129:8080/cms/manage/loginJump.do'
headers = {'Content-Type': 'application/x-www-form-urlencoded'}
# report_path = os.path.join(a1_path,'测试报告.html')
@ddt
class lg(unittest.TestCase):
    @data(*ts_et)
    @unpack
    def test_logjump(self,**dict):#定义一个测试用例
        reps=requests.post(url=url,headers=headers,
                        data={'userAccount':dict['userAccount'],
                        'loginPwd': dict['loginPwd']})
        print(reps.text)
def logjum():
    t_ime = time.strftime('%Y-%m-%H-%M-%S')
    a1_path = os.path.abspath(os.path.dirname(__file__))
    report_path = os.path.join(a1_path, t_ime+'测试报告.html')
    discre = unittest.defaultTestLoader.discover(start_dir=a1_path,pattern='g*.py')
    p = open(report_path,'wb')
    run = HTMLTestRunner(stream=p,title='CMS总计报告',description='执行情况',tester='you')
    run.run(discre)
if __name__ == '__main__':
    logjum()
    unittest.main()

在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/134074.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!