Unittest自动化测试入门总结

    科技2022-08-30  98

    从网上看视频教学、自己看博看等,总结了一下unittest必备的入门知识。

    Unittest基本应用:

    1、环境搭建:Python中直接加载了UnitTest框架,无须额外安装 2、四大组件: a.Test fixture:setUp(前置条件)、tearDown(后置条件),用于初始化测试用例及清理和释放资源 b.Test case:测试用例,通过继承unittest.TestCase,来实现对用例的继承,测试用例都是通过test识别的。 def test_xxxxx() c.Test suite:测试用例套件,也称之为测试用例集,可以将很多的测试用例加载到一个套件中,通过套件运行所有已经加载进来的测试用例 d.Test runner:运行器,一般通过runner来调用suite来执行测试 3、Unittest的运行机制:通过在main函数中,调用unittest.main()运行所有内容 4、setUp在用例执行之前会执行,tearDown在用例执行之后会执行,在每一个用例之前和之后都会执行 5、setUpClass 和 tearDownClass方法,在使用前需要用@classmethod进行初始化,作用:一个是在所有的setUp和tearDown运行之前,先初始化整个类,或者释放整个类的资源

    UnitTest自动化实现:

    1、为什么要用unittest框架?自动化测试减少冗余、便于维护,比较简便,容易维护测试用例 详见forTest2 2、ddt(data driver tests) 数据驱动,在实际测试中,单个测试是需要多种不同的条件(测试数据)对其进行测试的。 ddt的最基本应用:在class前定义@ddt装饰器,用于表明要使用ddt了 ,在基于实际的应用,选择对应的装饰器即可 data用于设置参数 unpack用于解析参数 ddt对于数据的解析方式:解析一个,传参一个 file_data:ddt中用于读取yml文件的装饰器 3、yml的几种格式: 字典:name: ‘yanhao’ 字典中嵌套字典:name: ‘yanhao’ Data: a: 1 b: 2 列表:- a - b - c

    UnitTest断言:

    1、什么是断言?用于校验实际结果与预期结果是否匹配,断言强调的是对于整个测试流程的结果进行判断,在断言的内容选择上是有要求的。 2、UnitTest中,TestCase已经提供了封装好的断言方法进行断言校验 3、每次断言的内容要是最核心的内容,即如果流程出了问题,断言一定会失败 4、断言的调用:self.assertxxxxx都是断言的方法 5、断言分很多类:基本的断言分类及用法如下:

    Unittest.skip() 1、用法:在Case中,对于不需要运行的用例或者特定条件下不执行的用例,可以应用skip()来实现有条件、有选择的执行,或者绝对性跳过,用于对指定用例不执行操作。 2、使用方法:使用skip装饰器进行使用,每一个skip只对当前用例生效 对于@unittest.skip,执行的是无条件跳过该用例 对于@unittest.skipif(condition, msg),执行的是有条件的跳过该用例,当condition为True的时候,不执行该用例,并且抛出后面的msg;当condition为False的时候,执行该用例。 对于@unittest.skipunless(condition, msg),执行的是有条件的跳过该用例,当condition为False的时候,不执行该用例,并且抛出后面的msg;当condition为True的时候,执行该用例。 对于@unittest.expectedFailure(),执行的期待该用例失败,失败的话不计入失败的cases数中

    测试套件及Runner的用法

    1、unittest中,一般的测试用例的执行顺序为 19;az;A~Z执行 2、测试套件的用处: ·用于给测试用例进行排序 ·管理测试用例

    3、使用测试套件suite运行测试用例的方法: 方法一:

    # coding:utf-8 import unittest from Unittest测试框架.Unittest中skip方法 import * # 创建一个测试套件,理解为一个集合,创建之初,是个空的集合 suite = unittest.TestSuite() # 给空的集合中,添加测试用例(相当于子元素)到测试套件(集合),连续添加了三个 suite.addTest(skiptest('test_2')) suite.addTest(skiptest('test_1')) suite.addTest(skiptest('test_3')) # 套件通过TestRunner()运行器,实现运行≈unittest.main() runner = unittest.TextTestRunner() # 和main()函数不同,只运行选中的case runner.run(suite) # 通过调用suite套件,运行case

    方法二:

    # coding:utf-8 import unittest from Unittest测试框架.Unittest中skip方法 import * # 创建一个测试套件,理解为一个集合,创建之初,是个空的集合 suite = unittest.TestSuite() # 使用列表的形式,添加测试用例,注意要使用 addTests() case = [skiptest('test_2'),skiptest('test_1'),skiptest('test_3')] suite.addTests(case) # 套件通过TestRunner()运行器,实现运行≈unittest.main() runner = unittest.TextTestRunner() # 和main()函数不同,只运行选中的case runner.run(suite) # 通过调用suite套件,运行case

    方法三:

    批量运行多个Unittest类中测试用例的方式:

    # coding:utf-8 import unittest from Unittest测试框架.Unittest中skip方法 import * # 创建一个测试套件,理解为一个集合,创建之初,是个空的集合 suite = unittest.TestSuite() # 相对路径 test_dir = './' # 将所有以forTe开头的.py文件中的测试用例,都保存discover中 discover = unittest.defaultTestLoader.discover(start_dir=test_dir, pattern='forTe*.py') # 套件通过TestRunner()运行器,实现运行≈unittest.main() runner = unittest.TextTestRunner() # 和main()函数不同,只运行选中的case runner.run(discover) # 运行discover中的测试用例

    方法四: (1)、通过TestCase加载一个.py的类中的所有 case:

    import unittest from Unittest测试框架.Unittest中skip方法 import skiptest # 创建一个测试套件,理解为一个集合,创建之初,是个空的集合 suite = unittest.TestSuite() suite.addTests(unittest.TestLoader().loadTestsFromTestCase(skiptest)) # 套件通过TestRunner()运行器,实现运行≈unittest.main() runner = unittest.TextTestRunner() # 和main()函数不同,只运行选中的case runner.run(suite) # 通过调用suite套件,运行所有的测试用例

    (2)、通过TestFromName,加载一个.py文件中的类的所有case:

    # coding:utf-8 import unittest # 创建一个测试套件,理解为一个集合,创建之初,是个空的集合 suite = unittest.TestSuite() suite.addTests(unittest.TestLoader().loadTestsFromName('Unittest中skip方法.skiptest')) runner = unittest.TextTestRunner() # 和main()函数不同,只运行选中的case runner.run(suite) # 通过调用suite套件,运行discover中的测试用例

    测试报告

    (1)、导入环境:下载HTMLTestRunnerb.py包,导入到python中的site-packages/lib文件中,修改部分源码,应用于python3中: 修改方法: 第94行,将import StringIO修改成import io 第539行,将self.outputBuffer = StringIO.StringIO()修改成self.outputBuffer = io.StringIO() 第642行,将if not rmap.has_key(cls):修改成if not cls in rmap: 第766行,将uo = o.decode(‘latin-1’)修改成uo = e 第775行,将ue = e.decode(‘latin-1’)修改成ue = e 第631行,将print >> sys.stderr, ‘\nTime Elapsed: %s’ % (self.stopTime-self.startTime)修改成print(sys.stderr, ‘\nTime Elapsed: %s’ % (self.stopTime-self.startTime)) (2)、导包: from HTMLTestRunner import HTMLTestRunner (3)、使用:会生成一个report.html 格式的文件,在使用前,进行路径的设置

    Processed: 0.016, SQL: 9