一.unittest是什么?
Unittest是python单元测试框架,是受到 JUnit 的启发,与其他语言中的主流单元测试框架有着相似的风格。其支持测试自动化,配置共享和关机代码测试。支持将测试样例聚合到测试集中,并将测试与报告框架独立。它不仅适用于单元测试,还在自动化测试领域占有一席之地。借助它组织执行测试用例,使用它提供的丰富的断言方法进行测试结果的比对,并结合HTMLTestRunner生成测试报告完成整个自动化测试流程。
二.简单使用示例
-
创建被测类calc.py
class count: def __init__(self, a, b): self.a = a self.b = b #计算加法 def add(self): return self.a + self.b #计算减法 def Subtraction(self): return self.a - self.b
-
通过unittest单元测试框架编写单元测试用例 test.py
from calc import count import unittest class CountTest(unittest.TestCase): def setUp(self) -> None: print("in case setUP") def tearDown(self) -> None: print("in case tearDow") def test_add(self): c = count(4, 5) self.assertEqual(c.add(), 9) def test_subtraction(self): f = count(9, 8) self.assertEqual(f.Subtraction(), 1) if __name__ == '__main__': CountTest.main()
说明:
-
首先引入unittest模块,创建testcount类继承unitest的testcase类。
-
setUp():用于测试用例执行前的初始化工作,与tearDown()相呼应,用于执行后的善后工作。
-
test_add中调用count类并传入要计算的数,通过调用add()方法得到两数相加的返回值,这里不再使用繁琐的异常处理,而是调用unitest框架所提供的assertEqual()对add()的返回值进行断言判断两者是否相等()。assertEqual()方法是由testcase类继承而来的。
-
main():unittest提供了全局的main()方法,使用它可以方便的将一个单元测试模块变成可以直接运行的测试脚本。main()方法使用Testloader类来搜索所有包含在该模块中以“test”命名开头的测试方法。
-
name:作为模块的内置属性,简单地说就是.py文件的调用方式。.py文件有两种使用方式作为模块调用和直接使用,如果它等于“main*”就表示是直接使用
三.unittest模块说明
-
TestCase:一个TestCase的实例就是一个测试用例,是一个完整的测试流程,包括测试前准备环境的搭建(setUp),实现测试过程的代码(run),测试后环境的还原(tearDown).
-
Test Suite:把多个测试用例集合在一起来执行。可以通过addTest加载TestCase到Test Suite(测试套件)中,从而返回一个TestSuite实例。
-
Test Runner:测试的执行,通过TextTestRunner类提供的run()方法来执行Test Suite/TestCase。Test Runner可以使用图形界面,文本界面,或者返回一个特殊的值的方式来表示测试执行的结果。
-
Test Fixture:对一个测试用例环境的初始化和清除。通过覆盖TestCase的setUp()和tearDown()方法来实现。tearDown()为下一个测试用例提供一个干净的环境。
四.断言方法
unittest框架的TestCase类提供的断言方法用于测试结果的判断
1.判断第一个参数和第二个参数是否相等
-assertEqual(first,second,msg=None) # 如果不相等则测试失败,msg为可选参数,用于定义测试失败时打印的信息。 self.assertEqual(j.add(),15,msg="测试结果不等于15")
格式:-assertNotEqual(first,second,msg=None)则与之相反
2.判断第一个参数是否在第二个参数中,简言之也就是检查第二个参数是否包含第一个参数
-assertIn(first,second,msg=None) -assertNotIn(first,second,msg=None)
实例:
def test_case(self): a = "hello" b = "hello world" self.assertIn(a,b,msg="a is not in b")
案例:
calc.py
class count: def __init__(self, a, b): self.a = a self.b = b # 计算加法 def add(self): return self.a + self.b # 计算减法 def Subtraction(self): return self.a - self.b
test.py
import unittest from day06.calc import count """ 测试用例类 需要继承unittest.TestCase, 表明了后面处理的是测试用例 一个方法对应一条测试用例 测试用例所对应的方法名要以test开头 self.assertEqual(a, 4):判断连个值是否相等 """ # 测试用例类 class CountTest(unittest.TestCase): # 编程测试加法的测试用例 def test_add01(self): # 先进行类的实例化 c = count(5, 4) # 调用实例方法