一、unittest 批量执行
我们在写用例的时候,单个脚本的用例好执行,那么多个脚本的时候,如何批量执行呢(串行执行)?这时候就需要用到 unittet 里面的 discover 方法来加载用例了。
加载用例后,用 unittest 里面的 TextTestRunner 这里类的 run 方法去一次执行多个脚本的用例。
二、新建测试项目
1.打开pycharm,左上角File>New Projetc>Pure Python,在 location 位置命名一个测试工程的名称:selenium_UnitTest 然后保存。
2.选中刚才新建的工程右键>New>Python Package>新建两个Python Package,分别命名为case 和 report,
3.在case文件夹中创建几个 Python Package,分别命名为如下:Model,SysManage,Tenant
4.在case下的子文件夹中创建test_xx.py,test_xx.py等文件;
在report文件夹中创建run_all_case.py,result.html两个文件;
接下来用run_all_case.py脚本去批量执行所有的用例。
三、diascover 加载测试用例
1).discover 方法里面有三个参数:
case_dir:这个是待执行用例的目录。
pattern:这个是匹配脚本名称的规则,test*.py 意思是匹配 test 开头的所有脚本。
top_level_dir:这个是顶层目录的名称,一般默认等于 None 就行了。
2).discover 加载到的用例是一个 list 集合,需要重新写入到一个 list 对象
testcase 里,这样就可以用 unittest 里面的 TextTestRunner 这里类的 run 方法去执行。
3).我们先在case下的子文件.py中分别写几个测试用例:
接下来就是编写run_all_case.py文件:
import unittest
#执行测试用例的目录
case_dir = r"F:\MTbaby\case" #这里填写你刚刚创建的case文件夹的目录
testcase = unittest.TestSuite()
discover = unittest.defaultTestLoader.discover(case_dir,pattern='test*.py',top_level_dir=None)
#discover方法筛选出来的用例,循环添加到测试套件中
for test_suit in discover:
for test_case in test_suit:
#添加用例到testcase
testcase.addTest(test_case)
print(testcase)
运行结果:
C:\Python27\python.exe F:/MTbaby/report/run_all_case.py
....
<unittest.suite.TestSuite tests=[<unittest.suite.TestSuite tests=[<baidu.test_01.Test testMethod=testadd>]>, <unittest.suite.TestSuite tests=[<baidu.test_02.Test testMethod=testjianfa>]>, <unittest.suite.TestSuite tests=[<blog.test_03.Test testMethod=testcheng>]>, <unittest.suite.TestSuite tests=[<blog.test_04.Test testMethod=testchu>]>]>
Time Elapsed: 0:00:00.007000
Process finished with exit code 0
四、 run 测试用例
1).为了更方便的理解,可以把上面 discover 加载用例的方法封装下,写成一个函数
2).先返回 TextTestRunner()类的实例
3).调用 run 方法去执行 all_case()这个函数
#-*- coding:utf-8 -*-
import unittest
def all_case():
#执行测试用例的目录
case_dir = r"F:\MTbaby\case"
testcase = unittest.TestSuite()
discover = unittest.defaultTestLoader.discover(case_dir,pattern='test*.py',top_level_dir=None)
#discover方法筛选出来的用例,循环添加到测试套件中
for test_suit in discover:
for test_case in test_suit:
#添加用例到testcase
testcase.addTest(test_case)
print testcase
return testcase
if __name__=="__main__":
#返回实例
runner = unittest.TextTestRunner()
#run所有用例
runner.run(all_case())
五、生成html报告
批量执行完用例后,生成的测试报告是文本形式的,不够直观,为了更好的展示测试报告,最好是生成 HTML 格式的。
unittest 里面是不能生成 html 格式报告的,需要导入一个第三方的模块:
HTMLTestRunner。
1.导入 HTMLTestRunner
1) 用pip命令安装HTMLTestRunner,pip命令如下:
pip install html-testRunner
这个命令一般默认安装的是最新版本的,网上有许多美化后的,是一个.py文件,安装路径一般在F:\Program Files\Python3.4.3\Lib\site-packages 这个文件夹里面的文件移到python根目录
2).把 HTMLTestRunner.py 这个文件保存到python的安装目录Lib下。
3).可以点击打开,然后复制保存成.py格式文件,然后复制到python安装目录的Lib目录下即可。
2.demo 解析
1).下载 Download 下的第二个文件 test_HTMLTestRunner.py,这个就是官方给的一个测试 demo 了,从这个文件可以找到该模块的用法。
2).找到下图这段,就是官方给的一个 demo 了,test_main()里上半部分就是加载测试 case,我们不需要搞这么复杂。
3).最核心的代码是下面的红色区域。
3.生成 html 报告
1).我们只需把上面红色区域代码 copy 到上一篇的基础上稍做修改就可以了,这里主要有三个参数:
stream:测试报告写入文件的存储区域
title:测试报告的主题
description:测试报告的描述
2).report_path 是存放测试报告的地址
所以我们可以修改run_all_case.py文件。
#-*- coding:utf-8 -*-
import unittest
def all_case():
#执行测试用例的目录
case_dir = r"F:\MTbaby\case"
testcase = unittest.TestSuite()
discover = unittest.defaultTestLoader.discover(case_dir,pattern='test*.py',top_level_dir=None)
#discover方法筛选出来的用例,循环添加到测试套件中
for test_suit in discover:
for test_case in test_suit:
#添加用例到testcase
testcase.addTest(test_case)
print testcase
return testcase
if __name__=="__main__":
#返回实例
#runner = unittest.TextTestRunner()
import HTMLTestRunner
report_path = r"F:\MTbaby\report\result.html"#这里就是你创建result.html
fp = open(report_path, 'wb')
runner = HTMLTestRunner.HTMLTestRunner(stream=fp,title=u'这是我的自动化测试报告',description=u'测试用例执行情况:')
# run所有用例
runner.run(all_case())
fp.close()
4.测试报告详情
打开你的result.html文件,会看到已经有测试报告了,哈哈~~
点开 View 里的 Detail 可以查看详情描述。
这里是全部pass的情况,我们来看一下执行测试用例failed的情况:修改test_01.py文件为:
#-*- coding:utf-8 -*-
import unittest
class Test(unittest.TestCase):
u'''这是加法运算'''
def testadd(self):
result = 10+8
hope = 20 #这里结果我们写成错误的
self.assertEqual(result,hope)
再次执行run_all_case.py脚本,然后刷新result.html文件:
我们看到有一个fail的结果,点开可看到错误产生的原因,是不是很方便啊~~~快去试试吧~
import unittest
import HtmlTestRunner
import time
file_path = "C:\\CTT\\CPUnitTest_Project\\report\\"
runner = HtmlTestRunner.HTMLTestRunner(output=file_path)
case_dir = r"C:\\CTT_UnitTest_Project\\case"
suite = unittest.TestSuite()
tests = unittest.defaultTestLoader.discover(case_dir,pattern='test*.py')
suite.addTests(tests)
now = time.strftime("%Y%m%d-%H%M%S", time.localtime())
reportFile = 'testResult' + now + '.html'
file = open(reportFile, 'wb')
runner.run(suite)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.youkuaiyun.com/mtbaby/article/details/77651488