1.单元测试 是指对软件中的最小可测试单元在与程序其他部分相隔离的情况下进行检查和验证的工作,这里的最小可测试单元通常是指函数或者类,一般是开发来做的 。
2.unittest框架用于单元测试,接口测试和UI测试,是python自带的测试框架。
官方文档 : https://docs.python.org/zh-cn/3.7/library/unittest.html
3.unittest中最核心的四个要素
- test case :测试用例。unittest中提供了一个基本类TestCase,可以用来创建新的测试用例,一个TestCase的实例就是一个测试用例。
- test suite : 测试套件。是一系列的测试用例,或测试套件,或两者皆有。它用于归档需要一起执行的测试。
- test fixure :测试脚手架。用于测试用例环境的搭建和销毁,比如创建一个临时的数据库或者启动一个服务器进程。
- test runner : 测试运行器。用来执行和输出测试结果的。可以用图形或者文本接口把返回的测试结果展示出来。
4.断言 :让程序代替人为判断测试程序执行结果是否符合预期结果的过程 。
断言方法 | 断言描述 |
---|---|
assertTrue(expr,msg=None) | 验证expr是true,如果为false,则fail |
assertFalse(expr,msg=None) | 验证expr是false,如果为true,则fail |
assertEqual(expected,actual,msg=None) | 验证expected==actual,不等则fail |
assertNotEqual(first,second,msg=None) | 验证first!=second,相等则fail |
assertIsNone(obj,msg=None) | 验证obj是None,不是则fail |
assertIsNotNone(obj,msg=None) | 验证obj不是None,是则fail |
assertIn(member,container,msg=None) | 验证是否member in container |
assertNotIn(member,container,msg=None) | 验证是否member not in container |
5.简单样例1
import unittest
class TestStringMethod(unittest.TestCase):
def test_upper(self):
self.assertTrue("foo".upper(),"FOO")
if __name__=="__main__":
unittest.main()
-
测试样例默认继承unittest.TestCase。
-
方法名必须以test开头, 这个命名约定告诉测试运行者类的哪些方法表示测试。
-
unittest.main() 提供了一个测试脚本的命令行接口。当在命令行运行该测试脚本,上文的脚本生成如以下格式的输出:
-
main()方法使用TestLoader类来搜索所有包含在该模块中以“test”命名开头的测试方法,并自动执行他们。执行方法的默认顺序是:根据ASCII码的顺序加载测试用例,数字与字母的顺序为:0-9,A-Z,a-z 。
-
通过 setUp() 和 tearDown() 方法,可以设置测试开始前与完成后需要执行的指令。
-
通过unittest类调用分析,可将框架的工作流程概况如下:
编写TestCase,由TestLoader加载TestCase到TestSuite,然后由TextTestRunner来运行TestSuite, 最后将运行的结果保存在TextTestResult中。
6.简单样例2
import unittest
class TestCase1(unittest.TestCase):
def testCase1(self):
print("one")
def testCase2(self):
print("two")
class TestCase2(unittest.TestCase):
def testCase1(self):
print("three")
def testCase2(self):
print("four")
if __name__ == '__main__':
suite1 = unittest.TestLoader().loadTestsFromTestCase(TestCase1)
suite2 = unittest.TestLoader().loadTestsFromTestCase(TestCase2)
suite = unittest.TestSuite([suite1,suite2])#将两个测试用例添加进测试套件中
unittest.TextTestRunner(verbosity=2).run(suite)#执行测试套件
运行结果如图: