我们在写用例的时候,单个脚本的用例好执行,那么多个脚本的时候,如何批量执行呢?这时候就需要用到 unittet 里面的 discover 方法来加载用例了。
加载用例后,用 unittest 里面的 TextTestRunner 这里类的 run 方法去一次执行多个脚本的用例。
1.打开pycharm,左上角File>New Projetc>Pure Python,在 location 位置命名一个测试工程的名称:MTbaby 然后保存,这里自己按照喜欢的名字去命名哦。
2.选中刚才新建的工程右键>New>Python Package>新建两个Python Package,分别命名为case 和 report,
3.在case文件夹中创建两个 Python Package,分别命名为 baidu和blog
4.在baidu文件夹中创建test_01.py,test_02.py两个文件;
在blog文件夹中创建test_03.py,test_04.py两个文件;
在report文件夹中创建run_all_case.py,result.html两个文件;
如图:
接下来用run_all_case.py脚本去批量执行所有的用例。
1).discover 方法里面有三个参数:
2).discover 加载到的用例是一个 list 集合,需要重新写入到一个 list 对象
testcase 里,这样就可以用 unittest 里面的 TextTestRunner 这里类的 run 方法去执行。
3).我们先在test_01.py,test_02.py,test_03.py,test_04.py这四个文件中分别写几个测试用例,比如分别执行加减乘除运算:
test_01.py文件
#-*- coding:utf-8 -*-
import unittest
class Test(unittest.TestCase):
u'''这是加法运算'''
def testadd(self):
result = 10+8
hope = 18
self.assertEqual(result,hope)
test_02.py文件
#-*- coding:utf-8 -*-
import unittest
class Test(unittest.TestCase):
u'''这是减法运算'''
def testjianfa(self):
result = 10-8
hope = 2
self.assertEqual(result,hope)
test_03.py文件
#-*- coding:utf-8 -*-
import unittest
class Test(unittest.TestCase):
def testcheng(self):
result = 10*8
hope = 80
self.assertEqual(result,hope)
test_04.py文件
#-*- coding:utf-8 -*-
import unittest
class Test(unittest.TestCase):
def testchu(self):
result = 10/5
hope = 2
self.assertEqual(result,hope)
接下来就是run_all_case.py文件:
#-*- coding:utf-8 -*-
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
....
.suite.TestSuite tests=[.suite.TestSuite tests=[.test_01.Test testMethod=testadd>]>, .suite.TestSuite tests=[.test_02.Test testMethod=testjianfa>]>, .suite.TestSuite tests=[.test_03.Test testMethod=testcheng>]>, .suite.TestSuite tests=[.test_04.Test testMethod=testchu>]>]>
Time Elapsed: 0:00:00.007000
Process finished with exit code 0
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 格式的。
unittest 里面是不能生成 html 格式报告的,需要导入一个第三方的模块:
HTMLTestRunner。
1.导入 HTMLTestRunner
1).这个模块下载不能通过 pip 安装了,只能下载后手动导入,下载地址:
http://tungwaiyip.info/software/HTMLTestRunner.html
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 到上一篇的基础上稍做修改就可以了,这里主要有三个参数:
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的结果,点开可看到错误产生的原因,是不是很方便啊~~~快去试试吧~