一、unittest核心概念
1.unittest四个核心概念
unittest四个核心概念包括:TestCase、TestSuite、TestRunner、Test Fixture
TestCase:即测试用例,测试用例是最小的测试单元。 它检查对一组特定输入的特定响应。 unittest提供了一个基类TestCase,它可用于创建一个新的测试用例。
一个TestCase的实例就是一个测试用例。一个测试用例就是一个完整的测试流程,包括测试前准备环境的搭建(setUp),执行测试代码(run),以及测试后环境的还原(tearDown)。元测试(unit test)的本质也就在这里,一个测试用例是一个完整的测试单元,通过运行这个测试单元,可以对某一个问题进行验证。
TestSuite:即测试套件,他是多个测试用例或者测试套件聚合在一起的集合,TestSuite可以嵌套TestSuite。
TestRunner:TextTestRunner是来执行测试用例的,其中的run(test)会执行TestSuite/TestCase中的run(result)方法。
Test Fixture:测试用例环境的搭建和销毁,在测试用例执行之前和之后会做的一些操作
2.unittest属性
unitte包含很多属性,其中常见的属性如下:
'TestResult', 'TestCase', 'TestSuite','TextTestRunner', 'TestLoader' 'FunctionTestCase', 'main','defaultTestLoader', 'SkipTest', 'skip', 'skipIf', 'skipUnless','expectedFailure', 'TextTestResult', 'installHandler','registerResult', 'removeResult', 'removeHandler'
from .result import TestResult from .case import (TestCase, FunctionTestCase, SkipTest, skip, skipIf, skipUnless, expectedFailure) from .suite import BaseTestSuite, TestSuite from .loader import (TestLoader, defaultTestLoader, makeSuite, getTestCaseNames, findTestCases) from .main import TestProgram, main from .runner import TextTestRunner, TextTestResult from .signals import installHandler, registerResult, removeResult, removeHandler
二、testCase
1.TestCase所含的方法
使用unittest是,需要创建一个类,该类继承unittest.TestCase,次数这个类可以看做是一个测试用例:
例如:class unTest(unittest.TestCase):
TestCase也是一个类,该类继承Object,这个类里面还有很多很多很多的方法,常用的就有:setUp、tearDown、setUpClass、tearDownClass、run以及各种断言方法。
'addCleanup', 'addTypeEqualityFunc', 'assertAlmostEqual', 'assertAlmostEquals', 'assertCountEqual', 'assertDictContainsSubset', 'assertDictEqual', 'assertEqual', 'assertEquals', 'assertFalse', 'assertGreater', 'assertGreaterEqual', 'assertIn', 'assertIs', 'assertIsInstance', 'assertIsNone', 'assertIsNot', 'assertIsNotNone', 'assertLess', 'assertLessEqual', 'assertListEqual', 'assertLogs', 'assertMultiLineEqual', 'assertNotAlmostEqual', 'assertNotAlmostEquals', 'assertNotEqual', 'assertNotEquals', 'assertNotIn', 'assertNotIsInstance', 'assertNotRegex', 'assertNotRegexpMatches', 'assertRaises', 'assertRaisesRegex', 'assertRaisesRegexp', 'assertRegex', 'assertRegexpMatches', 'assertSequenceEqual', 'assertSetEqual', 'assertTrue', 'assertTupleEqual', 'assertWarns', 'assertWarnsRegex', 'assert_', 'countTestCases', 'debug', 'defaultTestResult', 'doCleanups', 'fail', 'failIf', 'failIfAlmostEqual', 'failIfEqual', 'failUnless', 'failUnlessAlmostEqual', 'failUnlessEqual', 'failUnlessRaises', 'failureException', 'id', 'longMessage', 'maxDiff', 'run', 'setUp', 'setUpClass', 'shortDescription', 'skipTest', 'subTest', 'tearDown', 'tearDownClass'
2.几个常用方法讲解
(1)setUp和tearDown
setUp是前置设置条件,在自动化测试中setUp主要是进行测试前的初始化工作,比如在接口测试前面做一些前置的参数赋值,数据库操作等,一个测试用例执行之前,会先执行setUp方法,有几个测试用例,就会执行几次setUp方法
tearDown后置还原工作,teardown是测试后的清除工作,比如参数还原或销毁,数据库的还原恢复等,和setUp方法一样,有几个测试用例就执行几次
import unittest class unTest(unittest.TestCase): def setUp(cls): print("前置条件执行~\n") def tearDown(cls): print("后置条件执行~") def test_add(self): print(2+3) def test_minus(self): print(3-2) if __name__ == '__main__': unittest.main()
运行结果:上面一共有两个方法(测试用例),所以setUp和tearDown都各执行了两次
(2)setUpClass和tearDownClass
setUpClass和tearDownClass的功能和setUp、tearDown类似,不同的是,setUpClass和tearDownClass在整个测试模块中,只会执行一次,即所有测试用例执行之前执行setUpClass,在所有测试用例执行完成之后,执行tearDownClass
注意:在使用setUpClass和tearDownClass之前,记得添加一个@classmethod
import unittest class unTest(unittest.TestCase): @classmethod def setUpClass(cls): print("setUpClass前置条件执行~\n") @classmethod def tearDownClass(cls): print("tearDownClass后置条件执行~") def test_add(self): print(2+3) def test_minus(self): print(3-2) if __name__ == '__main__': unittest.main()
执行结果如下:
三、TestSuite
把多个测试用例集合在一起,需要用到testsuite套件,使用testsuite的作用是,用例可以按照添加的前后顺序来执行(执行顺序后面会分开讲),前面说过,把测试用例放入到suite集合中,需要用TestLoad来进行导入。例:
import unittest class unTest(unittest.TestCase): @classmethod def setUpClass(cls): print("setUpClass前置条件执行~\n") @classmethod def tearDownClass(cls): print("tearDownClass后置条件执行~") def test_add(self): print(2+3) def test_minus(self): print(3-2) if __name__ == '__main__': unittest.main()
以上的代码进行改造,把if后面的代码去掉,换成suite模式
1.按模块加载TestLoader()
方法是:(1)定义一个集合名称,一般直接用suite(也可以自己取名)
(2)调用unittest的TestLoader()方法,把测试用例添加到集合suite中
(3)调用unittest的TextTestRunner()方法执行集合里面的测试用例
import unittest class unTest(unittest.TestCase): @classmethod def setUpClass(cls): print("setUpClass前置条件执行~\n") @classmethod def tearDownClass(cls): print("tearDownClass后置条件执行~") def test_add(self): print(2+3) def test_minus(self): print(3-2) suite=unittest.TestLoader().loadTestsFromTestCase(unTest) unittest.TextTestRunner(verbosity=2).run(suite)
2.按类加载makeSuite
suite=unittest.TestSuite(unittest.makeSuite(类名)),这种方法会加载类中所有的测试用例
import unittest from test01 import * suite=unittest.TestSuite(unittest.makeSuite(unTest02)) unittest.TextTestRunner(verbosity=2).run(suite)
3.addTest方法
suite=unittest.TestSuite()
suite.addTest(unTest("test_add"))
这种方法是逐个加载类中的测试用例
import unittest from test01 import * suite=unittest.TestSuite() suite.addTest(unTest("test_add")) suite.addTest(unTest("test_minus")) suite.addTest(unTest02("test_multi")) unittest.TextTestRunner(verbosity=2).run(suite)
四、TestLoader
testloader是unittest中的一个方法,作用是把测试用例加载到集合中,加载的方式一共有4中:
loadTestsFromTestCase、loadTestsFromModule、loadTestsFromName、loadTestsFromNames
1.loadTestsFromTestCase方法
loadTestsFromTestCase是按类加载方式,即通过加载类,把该类下面的所有的测试用例(方法)加载到suite集合中:loadTestsFromTestCase(类名)
import unittest class unTest(unittest.TestCase): @classmethod def setUpClass(cls): print("setUpClass前置条件执行~\n") @classmethod def tearDownClass(cls): print("tearDownClass后置条件执行~") def test_add(self): print(2+3) def test_minus(self): print(3-2) #通过类加载,把unTest下面所有的方法都添加到suite中 suite=unittest.TestLoader().loadTestsFromTestCase(unTest) unittest.TextTestRunner(verbosity=2).run(suite)
2.loadTestsFromModule方法
loadTestsFromModule方法是按模块加载测试用例,loadTestsFromModule括号里面是模块名
模块一:test01.py,里面有两个类,一共5个方法
import unittest class unTest(unittest.TestCase): @classmethod def setUpClass(cls): print("setUpClass前置条件执行~\n") @classmethod def tearDownClass(cls): print("tearDownClass后置条件执行~") def test_add(self): print(2+3) def test_minus(self): print(3-2) class unTest02(unittest.TestCase): def test_multi(self): print(2 * 3)
同目录下,另创建一个模块:test_run.py
import unittest import test01#导入模块一:test01 suite=unittest.TestLoader().loadTestsFromModule(test01) unittest.TextTestRunner(verbosity=2).run(suite)
执行结果:
3.loadTestsFromName方法
loadTestsFromName(self, name, module=None),括号中name是字符串类型,即测试用例名称,module是模块名,可写可以不写,如果写了模块名,则name中就不必再指出属于哪个模块,如果不写module,则name中从module开始
test01为上面第 2点的一个模块,在另一个test.run.py模块中
(1)name=’test01.unTest.test_minus‘,module不填,运行结果也是正常的
import unittest suite=unittest.TestLoader().loadTestsFromName('test01.unTest.test_minus') unittest.TextTestRunner(verbosity=2).run(suite)
(2)name='unTest.test_minus',module=test01,下面两种方法运行都正常,运用module时,记得要先导入模块
import unittest import test01 suite=unittest.TestLoader().loadTestsFromName('unTest.test_minus',test01) #suite=unittest.TestLoader().loadTestsFromName('unTest.test_minus',module=test01) unittest.TextTestRunner(verbosity=2).run(suite)
4.loadTestsFromNames方法
loadTestsFromNames方法和loadTestsFromName方法类似,只不过loadTestsFromNames(self,names,module)中,names是一个列表,即同时加载同个模块中的多个测试用例
import unittest import test01 suite=unittest.TestLoader().loadTestsFromNames(['unTest.test_minus','unTest.test_add'],test01) unittest.TextTestRunner(verbosity=2).run(suite)
五、TextTestRunner
TextTestRunner()也是一个类,继承object,该类下面有两个常用的方法:_makeResult()、run(),所以要使用run方法执行suite,需要先调用这个类
unittest.TextTestRunner().run(suite)
TextTestRunner()括号中可以带一个参数verbosity
sun()方法是执行测试集合
六、输出测试报告
unittest默认输出的测试报告是控制台模式的,也有txt和html模式
1.输出txt格式
测试报告txt格式使用的方法是unittest自带的TextTestRunner()方法
import unittest import test01 suite=unittest.TestLoader().loadTestsFromModule(test01) filename=r"F:\reports\test.txt" file=open(filename,'a') runner=unittest.TextTestRunner( stream=file, descriptions=True, verbosity=2 ) runner.run(suite)
2.输出html格式
unittest组件HTMLTestRunner可以生成一个简单的的HTML报告
使用方法:
(1)设置测试报告的保存路径,比如保存在F盘的reports文件夹下,报告的文件明个为:re.html,路径为:F:\\reports\re.html
filename=“F:\\reports\re.html"
(2)把运行结果写到re.html文件中
file=open(filename,"wb")
(3)初始化runner
runner = HTMLTestRunner.HTMLTestRunner( stream=file, title="测试标题", description="报告中的文字描述" )
stream:是测试报告存放的地方和报告的名字
title:是报告中显示最上方的标题
description:是展示在报告中的文字描述
(4)运行脚本
runner.run(suite)
例如打印一个简单的报告:
import unittest import test01 import HTMLTestReportCN suite=unittest.TestLoader().loadTestsFromModule(test01) filename=r"F:\reports\test.html" file=open(filename,'wb') runner=HTMLTestReportCN.HTMLTestRunner( stream=file, title="html测试报告", tester="joba", verbosity=2 ) runner.run(suite)
其中
(1)html写进文件中时,需要用“wb"二进制的格式
(2)HTMLTestReportCN是中文的报告格式,需要从网上下载py文件HTMLTestReportCN:以中文形式输出报告,使用形式和HTMLTestRunner差不多,只是在初始化runner稍有差异,可以带tester,对比英文版如下: