python之使用单元测试框架unittest执行自动化测试

Python中有一个自带的单元测试框架是unittest模块,用它来作单元测试,它里面封装好了一些校验返回的结果方法和一些用例执行前的初始化操做。html

单元测试框架即一堆工具的集合。python

在说unittest以前,先说几个概念:mysql

TestCase 也就是测试用例sql

TestSuite 多个测试用例集合在一块儿,就是TestSuite浏览器

TestLoader是用来加载TestCase到TestSuite中的app

TestRunner是来执行测试用例的,测试的结果会保存到TestResult实例中,包括运行了多少测试用例,成功了多少,失败了多少等信息框架

unittest单元测试 --- “代码驱动”(用例是用代码写的),也支持“数据驱动”,将数据存在文件里去取数据
atp-根据excel,用例写在Excel里的,属于“数据驱动”
工具

 

  下面写一个简单的单元测试用例 单元测试

import unittest #导入unittest


def calc(a,b): return a/b class TestCalc(unittest.TestCase): # 继承unittest.TestCase
 @classmethod def setUpClass(cls): #必须使用 @ classmethod装饰器, 全部test运行以前运行一次
        print('我是setupClass') @classmethod def tearDownClass(cls): #必须使用 @ classmethod装饰器, 全部test运行结束后运行一次
        print('我是tearDownClass') def setUp(self):#每条用例执行以前都会先执行它
        print('我是setup') def tearDown(self):#每条用例执行以后都会执行它
        print('我是teardown') def test_calc1(self): #下面的三引号/双引号中显示的是描述信息
        '''测试正常的'''
        # result = calc(2,1)
        # self.assertEqual(2,result,'除法运算不正确')
        print('calc1') def test_calc2(self): print('calc2') "测试异常的"
        # result = calc(2, 2)
        # self.assertEqual(1,2,'结果不正确')

    def test_mysql(self): '''测试mysql'''
        print('test_mysql') def test_login(self): '''测试登陆'''
        print('print test_login') def test_abc(self): print('abc') def test_zbc(self): print('zbc') def test_fail(self): self.assertEqual(1,2,msg='测试失败的') #msg表示若是代码执行失败,则打印的信息
 unittest.main() #运行当前文件里面的全部测试用例 #执行顺序:执行全部以test开头的方法/用例,且按照方法/用例名称A-Z顺序执行,而不是按照书写顺序

 

#以上代码运行结果以下:
我是setupClass ...F... ====================================================================== 我是setup FAIL: test_fail (__main__.TestCalc) abc 我是teardown 我是setup calc1 我是teardown ---------------------------------------------------------------------- 我是setup calc2 Traceback (most recent call last): 我是teardown File "E:/Python学习/pycharm/python脚本/day12/单元测试unittest.py", line 58, in test_fail 我是setup 我是teardown self.assertEqual(1,2,msg='测试失败的') #msg表示若是代码执行失败,则打印的信息
我是setup AssertionError: 1 != 2 : 测试失败的 print test_login 我是teardown 我是setup ---------------------------------------------------------------------- test_mysql Ran 7 tests in 0.001s 我是teardown 我是setup FAILED (failures=1) zbc 我是teardown 我是tearDownClass

 

  下面是一些经常使用的断言,也就是校验结果学习

assertEqual(a, b)     a == b assertNotEqual(a, b) a != b assertTrue(x) bool(x) is True assertFalse(x) bool(x) is False assertIsNone(x) x is None assertIsNotNone(x) x is not None assertIn(a, b) a in b assertNotIn(a, b) a not in b

 

 

那如何生成一个测试报告呢,须要加入另一个模块了,HTMLTestRunner,这个模块须要本身安装,使执行测试用例就会生成一个html的测试报告,里面会有每一个测试用例的执行结果

HTML TestRunner:
用来产生测试报告的HTML TestRunner放入python安装目录下(sys.path目录),在打开pycharm的External Libraries -> Python 3.6.5有显示目录(C:\ProgramData\Anaconda3)
使用的时候直接 import HTML TestRunner便可

代码以下:

# test_suite = unittest.TestSuite() #建立一个测试集合 # test_suite.addTest(TestCalc('test_zbc')) #测试套件中添加测试用例

if __name__ == '__main__': # 产生很差看的报告:HTMLTestRunner
    f = open('report.html','wb') #打开一个保存结果的HTML文件
    runner = HTMLTestRunner.HTMLTestRunner(stream=f, description='测试报告里面的描述', title='接口测试报告') #生成执行用的对象
    test_suite = unittest.makeSuite(TestCalc) #把这个类变成一个测试集合
    runner.run(test_suite)#运行用例套件

 

#以上代码执行结果
...F...我是setupClass 我是tearDownClass <_io.TextIOWrapper name='<stderr>' mode='w' encoding='UTF-8'> Time Elapsed: 0:00:00

 

用浏览器打开的测试报告显示如图:

 

 若是咱们有不少个模块,每一个模块下面都写了不少python文件,每一个python文件里面都有测试用例,那怎么把这个目录下的用例都执行了呢,就要先找到这个目录下的全部python文件,而后找到里面的测试用例,逐个执行,代码以下:

import unittest,HTMLTestRunner suite = unittest.TestSuite()#建立测试套件
        all_cases = unittest.defaultTestLoader.discover(case_path,'test_*.py') #找到某个目录下全部的以test开头的Python文件里面的测试用例
        for case in all_cases: suite.addTests(case)#把全部的测试用例添加进来
        fp = open('res.html','wb') runner = HTMLTestRunner.HTMLTestRunner(stream=fp,title='all_tests',description='全部测试状况') runner.run(suite) #运行测试

 

还能够用BeautifulReport产生好看的测试报告

解压文件夹->将文件夹和setup.py复制到day12(当前要使用的目录)中 -》运行setup.py -》运行成功以后(运行结果显示success)把day12中的BeautifulReport文件夹删除
使用的时候直接 import BeautifulReport便可
以上方法不行的话,将BeautifulReport解压后的文件夹放入pycharm的External Libraries -> site-packages目录下
使用BeautifulReport,执行代码以下:

import BeautifulReport as bf #产生好看的报告
test_suite = unittest.makeSuite(TestCalc) #把这个类变成一个测试集合
runner = bf.BeautifulReport(test_suite) runner.report(filename='new_report.html',description='描述') #文件名必须是html格式的
#以上代码执行结果以下:
我是setupClass ...F...我是tearDownClass 测试已所有完成, 可前往E:\Python学习\pycharm\python脚本\day12查询测试报告

用浏览器打开的测试报告显示如图:

 用BeautifulReport执行多个python文件里的多个测试用例,代码以下:

import unittest import BeautifulReport import time tests = unittest.defaultTestLoader.discover(case_path,'*.py') #找指定路径下以.py结尾的文件
runner = BeautifulReport.BeautifulReport(tests)#运行找到的全部用例
today = time.strftime('%Y-%m-%d%H%M%S') file_name = '%s-report.html'%today #报告文件名
runner.report('utp自动化测试报告-%s'%today,filename=file_name,log_path=report_path)#产生报告

 

咱们在后续进行持续集成的时候,要让代码自动运行,就会用到Jenkins了,可是上面产生的测试报告都是html格式的,Jenkins不认识,就在Jenkins里面显示不出来。那我们就要产生一些Jenkins认识的测试报告,Jenkins认识xml格式的报告,那我们就产生xml格式的呗,就须要用一个新的模块,xmlrunner,安装直接 pip install xmlrunner便可,代码以下:

复制代码
import unittest import xmlrunner #导入这个模块 class My(unittest.TestCase): def test1(self,a,b,c): self.assertEqual(a+b,c) if __name__=='__main__': test_suite = unittest.TestSuite() test_suite.addTest(unittest.makeSuite(My)) runner = xmlrunner.XMLTestRunner(output='report')#指定报告放的目录 runner.run(test_suite)
复制代码

而后我们运行,能够看到在report目录下已经产生了xml格式的报告了,并且还自动把日期加上了

相关文章
相关标签/搜索