|
①单元测试是测试什么(单元测试的本质)
单元测试是类里面的方法是否是正确的。
②如何进行单元测试
调用方法-->传参-->观察结果-->比对期望结果与实际结果是否一致(一致则PASS,不一致则Faild)
③单元测试--测试用例(unittest是Python自带的用作单元测试的框架)
使用Python自带的unittest框架里专门用来写测试用例的TestCase类来写测试用例
1、测试用例的写法:
(1)每一条测试用例就是一个方法(def test_用例描述():)
(2)必须以“test”开头(强烈推荐使用“test_”开头)
(3)若测试用例不以“test”开头,则Python无法正常识别其为测试用例,控制台展示的执行结果也不一样。
(4)若一个模块(文件)中有多条测试用例,讲鼠标放在某一条测试用例上,然后单击鼠标右键,选择运行时则是仅执行当前的这一条用例;
(5)若一个测试类中有多条测试用例,讲鼠标放在测试类类名位置,然后单击鼠标右键选择运行,会执行当前测试类中所有的测试用例(有几条就执行几条),若放在空白位置单击鼠标右键选择运行,会执行当前模块(文件)中所有的测试用例(有几条就执行几条);
2、测试用例的执行顺序:
若一个模块(文件)中有多条测试用例,并且执行所有测试用例时,测试用例的执行顺序是遵循ASCII编码的大小规则,编码越小,执行优先级越高。(常见ASCII码的大小规则:0~9<A~Z<a~z,具体详见:ASCII编码详解)
④单元测试--断言
(1)unittest框架的TestCase类中常用的断言方法:
assertEqual(self, first, second, msg=None) --判断两个参数相等:first == second
assertNotEqual(self, first, second, msg=None) --判断两个参数不相等:first != second
assertIn(self, member, container, msg=None) --判断是字符串是否包含:member in container
assertNotIn(self, member, container, msg=None) --判断是字符串是否不包含:member not in container
assertTrue(self, expr, msg=None) --判断是否为真:expr is True
assertFalse(self, expr, msg=None) --判断是否为假:expr is False
assertIsNone(self, obj, msg=None) --判断是否为 None:obj is None
assertIsNotNone(self, obj, msg=None) --判断是否不为 None:obj is not None
(2)在unittest框架的TestCase类中有一个assertEqual方法,可以用来作为测试用例的断言来判断实际结果与预期结果是否一致。
(3)断言与异常处理结合使用
若断言和异常处理按照上图的方法进行结合使用,是有一个问题的,原本不通过的测试用例,虽然在控制台有打印断言错误信息,但最终Python还是判定该条测试用例通过,如此与实际结果不符。
可以使用raise将断言结果抛出来,即可完美解决断言和异常处理结合使用时,Python判断原本不通过的测试用例为通过的问题。
⑤单元测试--setup函数和teardown函数(初始化测试环境和清理测试环境)----unittest框架的TestCase类中已存在该函数(方法)
(1)执行每一条测试用例的时候,都会执行setup函数和teardown函数
(2)每一条测试用例执行前会执行setup函数;每一条测试用例执行结束会执行teardown函数;
执行每条测试用例时都手动传入参数
⑥单元测试--存储加载测试用例(TestSuite)
使用Python自带的unittest框架里专门用来加载测试用例的TestSuite类来加载测试用例
创建测试集合套件:suite = unittest.TestSuite()--->TestSuite()是TestSuite类的一个对象(即:suite是一个对象)
如果要使用TestSuite就要创建一个TestSuite的对象,然后添加测试用例的对象进来
TestSuite类继承了BaseTestSuite类,在BaseTestSuite类里有一个addTest函数
(1)添加测试用例方法一(通过测试类对象添加,单次添加单条测试用例)
TestSuite如果要加载测试用例,只能添加测试类的对象
TestLonin为测试类,TestLonin()即为测试类TestLonin的对象,而创建对象是否需要传参,要看父类(若有)是否有初始化函数,而TestLonin继承的是TestCase,在TestCase中有初始化函数需要传测试用例的方法名。
添加方法:suite.addTest(测试类的类名('测试用例方法名'))
(2)添加测试用例方法二(通过测试类批量添加测试类里所有的测试用例)
添加方法:suite.addTest(loader.loadTestsFromTestCase(测试类类名))
通过测试类批量加载测试用例时,Python会自动在测试类中找测试用例函数(函数名以test开头的函数),若测试类中存在以非test开头的测试用例函数名,Python将不认为这是一条测试用例,并且不予加载执行。所以必须确保测试类中的所有的测试用例的方法名都是以test开头。
(3)添加测试用例方法三(通过模块(文件)批量添加该模块(文件)中所有的测试用例)
添加方法:suite.addTest(loader.loadTestsFromModule(模块名))
(1)通过模块(文件)批量加载测试用例之前,必须要先导入该模块(文件)。
(2)通过模块(文件)批量加载测试用例时,Python会自动在模块(文件)中找测试用例函数(函数名以test开头的函数),若模块(文件)中存在以非test开头的测试用例函数名,Python将不认为这是一条测试用例,并且不予加载执行。所以必须确保模块(文件)中的所有的测试用例的方法名都是以test开头。
⑦单元测试--执行测试用例(TextTestRunner)
使用Python自带的unittest框架里专门用来执行测试用例的TextTestRunner类来执行测试用例
加载到测试套件中执行测试用例时,测试结果中的.代表PASS;F则代表Fail;E代表Error(有代码或数据错误)
⑧单元测试--生成测试报告
(1)通过Python自带的TextTestRunner类的函数生成---有点丑
先来看下TextTestRunner类的初始化函数
runner = unittest.TextTestRunner(stream=None, descriptions=True, verbosity=1)
TextTestRunner类中的stream表示用例结果写到哪里(默认在控制台展示)
TextTestRunner类中的descriptions表示描述
TextTestRunner类中的verbosity表示详细程度(0:只展示失败的测试用例;1:在0的基础上+共执行了多少条测试用例,通过(.表示通过)几条,失败(F表示失败)几条;2:展示所有测试用例的执行结果(最详细))
将TextTestRunner类中verbosity的值设置为0
看到已经执行完了而且生成了“TestSuite.txt”文件,现在看看文件里是啥
将TextTestRunner类中verbosity的值设置为1
这里跟上面的verbosity = 0差不多,只是将0改成了1而已,重点看下文件有什么不同
将TextTestRunner类中verbosity的值设置为2
这里跟上面的verbosity = 0和verbosity = 1差不多,重点还是看下文件有什么不同
这个虽然比上面的verbosity = 0和verbosity = 1的结果好看一丢丢,但还是很low又木有~
(2)通过网上下载HTMLTestRunnerNew.py文件生成---网页版的,好看点
第一步:将下载的HTMLTestRunnerNew.py文件放到Python安装目录的lib目录(例如:C:\Users\Administrator\AppData\Local\Programs\Python\Python38\Lib)中
第二步:就可以愉快的使用了(使用之前要先导入)
我们先来看看HTMLTestRunner类的初始化函数
runner = HTMLTestRunnerNew.HTMLTestRunner(stream=sys.stdout,verbosity=2,title=None,description=None,tester=None)
以上初始化函数中各参数的意义:
stream:结果写到哪里
verbosity:模式(详细程度,2是最详细的)
title:测试报告的标题
description:测试报告的描述
tester:测试者
下面我们通过HTMLTestRunner生成测试报告
因为是html格式的文件,我们需要通过浏览器查看
注意:在选择浏览器打开html格式的测试报告时,需要注意只有当设备中已经安装了相应的浏览器时才可以选择该浏览器打开(例如:当电脑中已经安装好了Chrome浏览器,此时才可以选择使用Chrome浏览器打开),如果不知道当前设备安装了哪种浏览器,或者当前设备安装的浏览器不在这里面,就选择通过默认默认浏览器(Default)打开即可。
我们看看html格式的测试报告是怎样的
|
评分
-
查看全部评分
|