最近好久没有写博客辣,主要啊因为博主在健身,哈哈哈。但学习从来没有落下过。哈哈哈哈。其实原本的打算后面想写一下关于数据库或者pytest框架方面的知识,但是啊因为前期一直在写ui自动化的时候一直用的unittest框架,但关于unittest框架的特性从阿里没有讲过,今天乘着周六大概的讲一下unittest框架的特性。
在unittest的文档中开篇就讲了四个很重要的概念,test fixtuer /test case/test suite/test runner下面简单的讲一个这四个特性的概念吧
1.test case:其实它就是一个测试用例的实例,什么是测试用例的实例呢?实际就是一个完整的测试流程从set Up到实施测试代码run到最后还原测试环境 tearDown 单元测试的本质其实就是这些
2.test suit:我们在测试一个功能的或者测试某一个场景的时候不可能只有一条测试用例,我们往往需要把同类的测试用例集合在一起执行,这样就产生了一个测试套件testsuit的概念啦。通过test suit用来组装单个测试用例。可以通过addTest加载TestCase到testsuit中,从而返回一个testsuit实例。现在看着有点懵是不是,后面会有栗子的,哈哈哈。
3.test runner:看名字我相信大家也已经猜到啦,就是执行测试啦,一般的单元测试框架中都会提供丰富的执行策略和执行结果,在unittest框架中,通过TextTestRunner类提供的run()方法来执行test suit/test case.
4.test Fixture:对一个测试环境的搭建和销毁,就是常用的setup() tearDown()每一条用例执行完后都会重启一次浏览器,一般啊在测试过程中我们用setup_class()与teardown_class()也比较多,它们是在一个类前后各运行一次运行完所有的用例才会关闭浏览器。
理解完上面几个概念后,我们来看一下具体的例子吧。
import unittest
class Test_login(unittest.TestCase):
def setUp(self):
print('test stat')
def tearDown(self):
print('test end')
def test_1(self):
print('这是测试用例1')
def test_2(self):
print('这是测试用例2')
if __name__ == '__main__':
'''构造测试集'''
suite = unittest.TestSuite()
'''通过addTest加载测试用例到测试集中'''
suite.addTest(Test_login('test_2'))
'''执行测试用例'''
runner = unittest.TextTestRunner()
runner.run(suite)
看一下执行结果,因为这是我们只加载了test_2到测试集中所以只执行test_2测试用例
test stat
.
这是测试用例2
test end
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK
进程已结束,退出代码 0
但是是上面的方法有一个特别大的弊端,就是当我们有成千上万条用例的时候通过addTest()添加测试用例就变得格外的麻烦。
这里啊unittest单元测试框架提供了TestLoader类中的discover()方法可以解决这个问题。
discover(start_dir,pattern='test*.py,top_level_dir = None)
找到指定目录下的测试模块,可以递归查到目录下所有的测试模块,只有匹配到的文件名才会被加载,如果启动不是顶层目录,那么顶层目录必须指定
start_dir:要测试的模块名称或者测试用例目录
pattern= "test*.py":测试用例名称的匹配规则
top_level_dir = None:测试模块的顶层目录,如果没有顶层目录默认为None
import unittest
case_dir ='./' #存放测试用例文件的目录
discover = unittest.defaultTestLoader.discover(case_dir,pattern='test*.py',top_level_dir=None)
if __name__ == '__main__':
runner = unittest.TextTestRunner()
runner.run(discover)
看一看执行结果:
..
test stat
----------------------------------------------------------------------
这是测试用例1
Ran 2 tests in 0.000s
test end
test stat
OK
这是测试用例2
test end
进程已结束,退出代码 0
我们可以将其上面的代码优化一下,封装好并结果测试报告。
import unittest
import time
def all_case():
case_dir ='./' #存放测试用例文件的目录
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.addTest(test_case)
print(testcase)
return testcase
if __name__ == '__main__':
from HTMLTestRunner import HTMLTestRunner #导包,关于如何生成HTML报告方法前面已经讲过这里不在赘述,有兴趣的小伙伴可以看博主前面写的博客
now = time.strftime("%Y-%m-%d %H_%M_%S")
uli = 'D:\\selenuim自动化\\case\\' + now + 'case.html'
fp = open(uli, 'wb')
runner = HTMLTestRunner(stream=fp, title=u'这是我的自动化测试报告', description=u'测试用例执行情况:')
runner.run(all_case()) #run所有测试用例
fp.close()
这样就大功告成了,哈哈哈。