网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
Result:存放单元测试的执行结果,也可以把每次执行的结果存到数据库打点,然后做测试结果趋势分析,如果后续把项目集成到Jenkins中的话,相当于Jenkins集成python单元测试,这样的话这层也可以不需要。
Case:测试案例层,针对上面Page对应的单个方法利用测试数据和期望数据进行assert判断,这里用到的测试数据和期望数据后续可以放在Excel中,测试人员只需填充测试数据。
Run:这里用来组装成suite然后进行运行案例。
二、测试
1.安装HTMLTestRunner
把它下载下来放到python安装目录的lib目录下
2.业务逻辑层
这里模拟一些业务处理,这里做接口自动化时会使用requests库进行请求。
# -*- coding: utf-8 -*- import sys reload(sys) sys.setdefaultencoding('utf-8') import requests def Add(name,pwd): session=requests.session() response=session.get('http://www.baidu.com') print(response.status_code) return response.status_code==200 def Edit(name,pwd): return {'name':name,'pwd':pwd} def Delete(name,pwd): return {'name':name,'pwd':pwd} def Search(name,pwd): return {'name':name,'pwd':pwd}
3.案例层
原本计划增加一个套件suite层,如果是单个接口的不加也可以,如果是多个接口进行流程测试,使用suite时案例的顺序就不会改变。如果是流程的,也可以写成case,只是里面需要多次调用业务逻辑层。
# -*- coding: utf-8 -*- import sys reload(sys) sys.setdefaultencoding('utf-8') import unittest from Root.Page import Login from Root.Page.UserManager import Index import HTMLTestRunner import time class index(unittest.TestCase): def setUp(self): print('setUp') def tearDown(self): print('tearDown') def test_add(self): arr= Login.Login('admin', '123456') flag= Index.Add(arr[0], arr[1]) self.assertTrue(flag) flag= Index.Add(arr[0], arr[1]) self.assertTrue(flag==False) def test_edit(self): response= Login.Login('admin', '123456') dic= Index.Edit(response[0], response[1]) self.assertNotEqual(dic,{'name':'123'}) def test_delete(self): response= Login.Login('admin', '123456') dic= Index.Delete(response[0], response[1]) self.assertNotEqual(dic,{'name':'123'})
4.运行
这里主要考虑可能整个系统会分成不同的模块进行运行,这样也能维护上也必将方便,可以多执行机执行。这里使用的HTMLTestRunner来生成报告.
# -*- coding: utf-8 -*- import sys reload(sys) sys.setdefaultencoding('utf-8') import os import unittest from HTMLTestRunner import HTMLTestRunner from Root.Test.Case.UserManager import Index import HTMLTestRunner import time if __name__ == '__main__': # 1、构造用例集 suite = unittest.TestSuite() # 2、执行顺序是安加载顺序:先执行test_sub,再执行test_add suite.addTest(Index.index("test_add")) suite.addTest(Index.index("test_edit")) suite.addTest(Index.index("test_delete")) suite.addTest(Index.index("test_edit")) suite.addTest(Index.index("test_edit")) filename = "../../../Result/{0}Report.html".format(time.strftime("%Y%m%d%H%M%S", time.localtime()) ) # 定义个报告存放路径,支持相对路径 f = file(filename, 'wb') # 结果写入HTML 文件 runner = HTMLTestRunner.HTMLTestRunner(stream=f, title='测试报告', description='XXX系统接口自动化测试测试报告',verbosity=2) # 使用HTMLTestRunner配置参数,输出报告路径、报告标题、描述 runner.run(suite)
三、测试案例参数化
上面的每个单元测试只能运行一个测试案例的数据,就是如何实现参数化,这样配置一下案例数据就能运行多次单元测试,这样就会方便很多。找了下python自带的单元测试框架不支持,这里使用了nose和parameterized 。
# -*- coding: utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
from nose.tools import assert_equal
from parameterized import parameterized
import HTMLTestRunner
import time
import unittest
import math
![img](https://img-blog.csdnimg.cn/img_convert/c3f610ce241e133ec96515c48d0b0aa4.png)
![img](https://img-blog.csdnimg.cn/img_convert/da210ccdbba90a44c8d8f6ef0219f3e2.png)
![img](https://img-blog.csdnimg.cn/img_convert/f7ec7ed042ec35f3c3e5d8b4c4769696.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618631832)**
的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618631832)**