最新自动化测试框架-----unittest篇_unittest项目结构,软件测试源码剖析之Framwork层消息传递

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化的资料的朋友,可以戳这里获取

| — | — |
| | #方式一:创建子类继承unittest.TestCase,然后重写runTest方法 |
| | class WidgetTestCase(unittest.TestCase): |
| | def setUp(self): |
| | pass |
| | def runTest(self): |
| | pass |
| | def tearDown(self): |
| | pass |
| | |
| | #方式二:编写以test开头的方法 |
| | class WidgetTestCase(unittest.TestCase): |
| | def setUp(self): |
| | pass |
| | def test_xx1(self) |
| | def test_xx2(self) |
| | ... |
| | def test_xxN(self) |
| | def tearDown(self): |
| | pass |

unittest构建测试套件(测试用例集合):

前提Tester是继承了unittest.TestCase的子类

#方式一:
Suite=unittest.TestSuite()
Suite.addTest(Tester('test_default_size'))
Suite.addTest(Tester('test_resize'))
#方式二(推荐):
def suite():
Suite=unittest.TestSuite()
Suite.addTest(Tester('test_default_size'))
Suite.addTest(Tester('test_resize'))
return suite
#方式三(推荐):
def suite():
tests=['test_default_size','test_resize']
return unittest.TestSuite(map(Tester,tests))
#构建测试套件举例:
#存在如下类calc:
#encoding:utf-8
class calc(): #计算器类
def __init__(self,a,b): #初始化
self.numa=a
self.numb=b
def sum(self): #加法
return self.numa+self.numb
def sub(self): #减法
return self.numa-self.numb
def multi(self): #乘法
pass
#测试方法
import unittest #导入unittest
import calc
class mytest(unittest.TestCase):
def setUp(self): #初始化工作
self.testnum=calc.calc(3,4)
def tearDown(self): #退出清理工作
del self.testnum
def testsum(self): #具体的测试用例
self.assertEqual(self.testnum.sum(),7,"testing sum")
def testsub(self): #具体的测试用例
self.assertEqual(self.testnum.sub(),-1,"testing sub")
def testmulti(self): #具体的测试用例
self.assertEqual(self.testnum.multi(),12,"testing multi")
def suite():
Suite=unittest.TestSuite()
Suite.addTest(mytest('testsum'))
Suite.addTest(mytest('testsub'))
return suite
if __name__=="__main__":
unittest.main(defaultTest='suite')
unittest忽略测试用例:

unittest支持忽略部分测试用例不执行,分无条件忽略和有条件忽略,通过装饰器实现。
使用unittest.skip装饰器族跳过test method或者test class,这些装饰器包括:
1.@unittest.skip(reason):无条件跳过测试,reason描述为什么跳过测试
2.@unittest.skipIf(condition,reason):condition为true时跳过测试
3.@unittest.skipUnless(condition,reason):condition不是true时跳过测试
4.@expected failure:使用@unittest.expectedFailure装饰器,如果test失败了,这个test不计入失败的case数目

举例:

def testsub(self): #具体的测试用例
self.assertEqual(self.testnum.sub(),-1,"testing sub")
@unittest.skip("test skipping") #跳过测试用例
def testmulti(self): #具体的测试用例
self.assertEqual(self.testnum.multi(),12,"testing multi")
运行测试集

unittest使用TestRunner类作为测试用例的基本执行环境,来驱动整个单元测试过程,在单元测试时,一般不直接使用TestRunner类,而是使用其子类TextTestRunner来完成测试,并将结果以文本方式显示出来。

Runner = unittest.TestTestRunner()
runner.run(suite)

同时,在unittest模块中定义了一个名为main的全局方法,使用它可以很方便地将一个单元测试模块变成可以直接运行的测试脚本,main()方法使用TestLoader类来搜索所有包含在该模块中的测试方法,并自动执行它们。按照(以test开头)来命名所有测试方法,只需要在测试模块的最后加入如下几行代码:

if __name__=="__main__":
unittest.main()

或者加参数如下:

unittest.main(defaultTest='suite')
批量执行测试用例

通过前面的介绍,我们可以在一个.py文件里面编写多个测试用例,然后执行文件里的所有测试用例,但是如果测试用例数量过多,放一文件里面就不合理了。
比较合理的做法是把相关的几条用例放到一个.py文件里,把所有.py的文件放到一个文件夹下,然后通过一个程序执行文件夹里面所有用例。

目录结构:

  • unittest
    • test_case
      • search.py
      • baidu.py
    • test_case.py

baidu.py内容如下:

#-*- coding:utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
import time,os,unittest
class baidu(unittest.TestCase):
def setUp(self):
Chromedi="D:\Google\Chrome\Application\chromedirver.exe"
os.enciron["webdriver.Chrome.driver"]=Chromedi
self.driver=webdriver.Chrome(Chromedi)
self.baseurl="http://www.baidu.com"
self.verificationErrors=[]
self.accpet_next_alert=True
#测试百度知道链接是否正确
def test_baidu_set(self):
driver=self.driver
driver.maxmize_window()
driver.get(self.baseurl+"/")
m=dirver.find_element_by_name("tj_briicon")
ActionChains(driver).move_to_element(m).perform()
driver.find_element_by_partial_link_text("知道").click()
# self.assertEqual(driver.current_url,"http://zhidao.baidu.com/")
self.assertEqual(driver.title,u"百度知道-全球最大中文互动问答平台")
time.sleep(2)
def tearDown(self):
self.driver.quit()
if __name__=="__main__":
unittest.main()

search.py内容如下:

#-*- coding:utf-8 -*-
from selenium import webdriver
import time,os,unittest
class search(unittest.TestCase):
def setUp(self):
Chromedi="C:\Google\Chrome\Application\chromedriver.exe"
os.environ['webdriver.Chrome.driver']=Chromedi
self.driver=webdriver.Chrome(Chromedi)
self.baseurl="http://www.baidu.com"
self.verificationErrors=[]
self.accpet_next_alert=True
#测试百度搜索
def test_search(self):
driver=self.driver
driver.maximize_window()
driver.get(self.baseurl+"/")
driver.find_element_by_css_selector("#kw").send_keys("12306")
driver.find_element_by_css_selector("#su1").click()
def tearDown(self):
self.driver.quit()
self.assertEqual([],self.verificationErrors)
if __name__=="__main__":
unittest.main()

test_case.py内容如下:

import os
caselist=os.listdir("D:\\unittest\\test_case")
for a in caselist:
s=a.split('.')[-1]
if s=='py':
os.system('python D:\\unittest\\test_case\\%s 1>>log.txt 1>>&1'%a)

caselist获取test_case目录下所有的文件列表做成列表
“baidu.py"为列表的一个元素,用split以”."分割为2个字符串,[-1]表示取出后面py的字符串,判断是否是测试用例文件。如果是用os.system执行DOS命令,DOS命令为执行测试用例并把日志打印到log.txt

至此,一个简单的单元自动化测试框架实现完毕。

生成HTMLTestRunner测试报告

HTMLTestRunner是Python标准库的unittest模块的一个扩展。它能生成易于使用的HTML报告。
1、下载HTMLTestRunner.py文件:
地址:HTMLTestRunner - tungwaiyip’s software
2、将该文件保存在python安装路径下的lib文件夹中。在文件中能import HTMLTestRunner成功,即配置成功。
注:如果失败,在项目中新建一个这样的文件也是可以的,只要达到能引入和使用就行。

针对baidu.py文件修改如下:
import HTMLTestRunner #导入HTMLTestRunner报告

if __name__=="__main__":
suite=unittest.TestSuite() #构建测试套件
suite.addTest(baidu("test_baidu_set")) #添加测试用例到套件
filename='D:\\unittest\\test_case\\result.html' #建立HTML报告文件
fp=file(filename,'wb')
runner=HTMLTestRunner.HTMLTestRunner(stream=fp,title=u"百度知道测试报告",description=u"用例执行情况:") #自定义测试报告
runner.run(suite) #运行测试用例

说明:
使用HTMLTestRunner配置参数,stream为输出报告路径、title为报告标题、description为描述信息

不同文件中的用例构建测试套件

生成HTMLTestRUnner测试报告的时候,会发现一个.py文件产生一个测试报告,那么对于测试用例的多个测试用例文件会产生多个测试报告,这在实际中会导致测试报告不方便阅读;如果把所有测试用例写在一个py文件里,会导致用例不好维护。
之前使用TestSuite只是在一个.py文件里添加多个测试用例,我们可以跨文件通过TestSuite来组织测试用例。

import unittest #导入单元测试框架
import asearch,baidu #导入测试用例py文件
alltest=unittest.TestSuite() #构建测试套件
alltest.addTest(unittest.makeSuite(asearch.search)) #增加测试用例集
alltest.addTest(unittest.makeSuite(baidu.baidu)) #增加测试用例集
runner=unittest.TextTestRunner(verbosity=2)
runner.run(alltest) #运行测试

makeSuite用于生产testsuite对象的实例,把所有的测试用例组装成TestSuite,最后把TestSuite传给TestRunner执行。

测试套件的语法:

suite1=module1.TheTestSuite()
suite2=module2.TheTestSuite()
alltests=unittest.TestSuite((suite1,suite2))

整合测试报告

import unittest #导入单元测试框架
import asearch,baidu #导入测试用例py文件
import HTMLTestRunner
alltest=unittest.TestSuite() #构建测试套件
alltest.addTest(unittest.makeSuite(asearch.search)) #增加测试用例集
alltest.addTest(unittest.makeSuite(baidu.baidu)) #增加测试用例集
filename="D:\\unittest\\test_case\\result.html"
fp=file(filename,'wb')
runner=HTMLTestRunner.HTMLTestRunner(stream=fp,title=u"百度知道测试报告",description=u"执行测试用例情况test:")
runner.run(alltest)

备注:unittest.makeSuite()是直接从一个TestCase的类生成一个TestSuite。
测试套件运行每个测试用例的顺序是由测试方法名根据Python内建函数cmp所排序的顺序而决定的。

测试报告再优化

1、易读性优化:
可以给每个测试用例加上注释:

def test_baidu_self(self):
"""百度知道链接测试"""
driver=self.driver
driver.maximize_window()

2、测试报告名称加时间戳:
引入python的time模块给测试报告加自定义名称

import time
#生成格式化时间
now=time.strftime("%Y_%m_%d_%H_%M_%S",time.localtime(time.time()))
#now=time.strftime("%Y_%m_%d_%H_%M_%S")
#采取字符串拼接给测试报告加时间
filename='D:\\unittest\\test_case'+now+'_result.html'
#生成的报告文件名格式为:2019_01_01_10_30_59_result.html
框架结构改进

1、执行用例的主文件移出测试用例文件夹
执行用例的主文件是执行所有测试用例的程序,而并非是测试用例本身,把它移出来结构更为合理。
移出来执行用例的主文件后,会发现import测试用例类报错,这是需要使用python包。

在test_case下新建一个__init__.py的文件,文件内容可以为空,同时将test_case目录添加到sys.path中

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化的资料的朋友,可以戳这里获取

__.py的文件,文件内容可以为空,同时将test_case目录添加到sys.path中

[外链图片转存中…(img-a8nG9rRy-1715701236575)]
[外链图片转存中…(img-KBqIbjN3-1715701236576)]
[外链图片转存中…(img-ku3Ujzco-1715701236576)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化的资料的朋友,可以戳这里获取

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值