一、什么是单元测试&单元测试的对象
1.定义:单元测试是用来对一个模块、一个函数或者一个类来进行正确性检验的测试工作
2.单元测试中最核心的四个概念:test case(测试用例),test suite(测试套件),test runner(测试运行器),test fixture(测试环境数据准备和数据清理或者测试脚手架)
1)test case:一个testcase的实例就是一个测试用例。测试前准备环境的搭建(setUp),执行测试代码(run),以及测试后环境的还原(tearDown)
2)TestSuite:多个测试用例集合在一起。
3)TestLoader:用来加载Testcase到TestSuite中。
4)TextTestRunner:用来执行测试用例,其中run(test)会执行TestSuite/TestCase中的run(result)方法。
5)test fixture:测试用例环境的搭建和销毁
综上,整个流程就是首先要写好TestCase,然后由TestLoader加载TestCase到TestSuite,然后由TextTestRunner来运行TestSuite,运行的结果保存在TextTestResult中,整个过程集成在unittest.main模块中。
二、初级使用
1.步骤
1)导入unittest模块,被测文件或者其中的类
2)创建一个测试类,被继承unittest.TestCase
3)重写setUp和tearDown方法(如果有初始化条件和结束条件)
4)定义测试函数,函数名以test_开头
5)在函数体中使用断言来判断测试结果是否符合预期结果
6)调用unittset.main()方法运行测试用例--------无此方法也是可以运行
2.使用setUp和tearDown方法,每次执行测试用例都会执行初始化化条件和结束条件
image.png由代码看到,每次执行用例前都会执行初始化条件和结束条件,两个测试用例,共执行了两次初始化条件和结束条件。
3.设置setupClass和teardownClass:执行所有测试用例,仅执行一次初始化条件和结束条件
image.png4.断言Assert----结果对比的函数
Method | Checks that |
---|---|
assertEqual(a,b):相等 | a==b |
assertNotEqual(a,b) | a!=b |
assertTrue(x) | bool(x) is True |
assertFalse(x) | bool(x) is False |
assertIs(a,b) | a is b 判断是否是同一现象 |
assertIsNot(a,b) | a is not b |
assertIsNone(x) | x is None |
assertIsNotNone(x) | x is not None |
assertIn(a,b):a是否在b中 | a in b |
assertNotIn(a,b) | a not in b |
assertIsInstance(a,b):实例对象 | isInstance(a,b) |
assertNotIsInstance(a,b) | not isInstance(a,b) |
设置断言,当某条测试用例执行失败,不会影响其他测试用例的执行
image.png image.png
也可以直接用 ==,!=,<=,>=来判断
image.png
写一个方法,通过unittest来执行
image.png
image.png
三、进阶使用
1.TestSuite:
addTest():添加单个测试用例
addTests([,,]):添加多个测试用例
image.png
2.addTest的参数:是一个测试用例的列表
1. 方式一:类名(‘方法名’)的集合
2.方式二:unittest.TestLoader.discover方法匹配目录下的用例-----用的最多的,测试用例在一个目录下
discover方法中默认匹配模式是从当前目录下找以test开头的py文件。测试用例的顺序执行是根据字母a-z,0-9的顺序执行的。
3.方式三:unittest.TestLoader.loadTestsFromModule匹配模块中的测试用例
PS:TestLoader类、TestSuite类、TestRunner类需要先实例化再使用
如下是一个单元测试的实例
image.png
#实例:采用unittest.TestLoader.discover方式加载测试用例。
######定义函数:Myclass_test.py
class Myclass_Test():
def __init__(self,a,b):
self.a = a
self.b = b
def sum(self):
sum = self.a + self.b
return sum
def sub(self):
sub = self.a - self.b
return sub
######定义测试类1:test_Myclass1.py
import unittest
from my_Unittest import Myclass_test
class Test_myclass(unittest.TestCase):
def setUp(self):
self.myclass = Myclass_test.Myclass_Test(11,10)
def test_sum(self):
sum = self.myclass.sum()
print('class1sum = '+str(sum))
self.assertEqual(21,sum)
def test_sub(self):
sub = self.myclass.sub()
print('class1sub = '+str(sub))
self.assertNotEqual(10,sub)
######定义测试类2:test_Myclass2.py
import unittest
from my_Unittest import Myclass_test
class Test_myclass(unittest.TestCase):
def setUp(self):
self.myclass = Myclass_test.Myclass_Test(1,10)
def test_sum(self):
sum = self.myclass.sum()
print('class2sum = '+str(sum))
self.assertEqual(11,sum)
def test_sub(self):
sub = self.myclass.sub()
print('class2sub = '+str(sub))
self.assertNotEqual(10,sub)
######主函数的调用:Myclass_main.py
import unittest
import os
#实例化测试套件对象
s = unittest.TestSuite()
#实例化TestLoader的对象
loader = unittest.TestLoader()
#使用discover()去找一个目录下的所有测试用例的文件,并将返回数据添加到测试套件中。
s.addTests(loader.discover(os.getcwd()))
run = unittest.TextTestRunner()
run.run(s)
3.测试报告的生成
第一种:text文件----写到txt文件中
#第一种:unittest自带的方法
#创建一个文件,以写的方式打开
import unittest
import os
#实例化测试套件对象
s = unittest.TestSuite()
#实例化TestLoader的对象
loader = unittest.TestLoader()
#使用discover()去找一个目录下的所有测试用例的文件,并将返回数据添加到测试套件中。
s.addTests(loader.discover(os.getcwd()))
fs = open('test_run_report.txt','w')
run = unittest.TextTestRunner(fs)
run.run(s)
第二种:html测试报告
需下载HTMLTestRunner.py文件,http://tungwaiyip.info/software/HTMLTestRunner.html
下载后放到Python安装目录的Lib目录下即可。同时需修改文件中部分内容,附上链接:https://www.cnblogs.com/hellomaster/p/11040277.html
HTMLTestRunner参数详解:
verbosity
=1的时候 默认值为1,不限制完整结果,即单个用例成功输出’.’,失败输出’F’,错误输出’E’
=0的时候。不输出信息
=2的时候,需要打印详细的返回信息
--stream:测试报告写入文件的存储区域
--title:测试报告的主题
--description:测试报告的描述
import os
from HTMLTestRunner import *
# 实例化测试套件对象
s = unittest.TestSuite()
# 实例化TestLoader的对象
loader = unittest.TestLoader()
# 使用discover()去找一个目录下的所有测试用例的文件,并将返回数据添加到测试套件中。
s.addTests(loader.discover(os.getcwd()))
with open(os.getcwd() +"/test_report.html","wb") as fp:
runner = HTMLTestRunner(
stream=fp,
verbosity=1,
title="测试报告标题",
description="测试报告描述信息",
)
runner.run(s)
HTMLTestRunner踩坑记录:
1、导入的时候,尽量写成from HTMLTestRunner import *,如果是import HTMLTestRunner,那么下面调用的时候,要写成HTMLTestRunner.HTMLTestRunner
https://www.cnblogs.com/hellomaster/p/11040277.html
2、使用with open写入文件的时候,runner.run要放在with open里面
https://www.cnblogs.com/chuiyuedefeng/p/11902018.html
3、因为写入的是二进制文件,所以写入方式要用wb,使用w会报错
https://blog.csdn.net/kingyuan666/article/details/81214954
网友评论