你好啊!我是程序员山茶,你也可以称我为测试开发Guide。本文首发“unittest”
每个语言都包含有自己的测试框架,python中同样有很多测试框架,具体如下
unittest: unittest是Python自带的单元测试框架,它提供了类和方法来编写和组织测试用例,以及各种断言方法用于验证结果
pytest: 是一个第三方的Python测试框架,它具有简洁的语法和丰富的功能集。支持自动发现测试文件和函数,提供了强大的断言方法,以及插件生态系统,可以扩展测试功能
nose:是另一个流行的第三方测试框架,它建立在unittest之上,提供了更简洁的语法和额外的功能,如自动发现测试、测试生成器、测试覆盖率报告等
doctest: doctest是Python标准库中的一个模块,它允许在文档字符串中编写测试用例。doctest将文档中的示例代码提取出来,并自动运行并验证结果,以确保示例代码的正确性
Testify: 一个相对较新的Python单元测试框架,它提供了一套简洁而强大的工具和断言方法,用于编写单元测试和集成测试
behave:behave是一个行为驱动开发(BDD)框架,它使用自然语言来描述系统行为,并将这些描述转化为可执行的测试用例
本文主要介绍unittest框架。
unittest框架是一个功能强大的单元测试工具,不仅适用于单元测试,还可用于web自动化测试。它提供了丰富的断言方法,可组织和执行测试用例,并生成测试结果
TestCase测试用例,一个TestCase就是一条测试用例
TestSuite测试套件,多条TestCase测试用例集合。TestSuite可以嵌套TestSuite,即测试用例集合数据可以是测试用例集合
TestRunner执行测试,执行测试用例套件
TestFixture对一个测试环境的搭建和销毁,被称为一个Fixture,比如数据库连接关闭、测试环境数据清理、启动关闭服务进程
TestLoader是unittest框架中的一个类,用于将TestCase加载到TestSuite中。它提供了几个loadTestsFrom__()
方法,这些方法用于从不同的源中寻找TestCase并创建它们的实例。它们会将这些TestCase实例添加到TestSuite中,并返回一个包含TestCase的TestSuite实例
使用原则
测试模块引入 import unittest
测试类必须继承 unittest.TestCase
测试方法必须以“test开头”,执行顺序按照开头字符串ASCII码升序执行。
测试类和测试方法
断言方法
以下断言方法是unittest框架中的一部分,用于在测试过程中进行验证和断言
序号 | 方法 | 校验内容 |
1 | assertEqual(a, b) | 断言a等于b |
2 | assertNotEqual(a, b) | 断言a不等于b |
3 | assertTrue(x) | 断言x为True |
4 | assertFalse(x) | 断言x为False |
5 | assertls(a, b) | 断言a和b是同一个对象 |
6 | assertlsNot(a, b) | 断言a和b不是同一个对象 |
7 | assertlsNone(x) | 断言x为None |
8 | assertlsNotNone(x) | 断言x不为None |
9 | assertln(a, b) | 断言a包含在b中 |
10 | assertNotln(a, b) | 断言a不包含在b中 |
11 | assertlslnstance(a, b) | 断言a是b的实例 |
12 | assertNotlsInstance(a, b) | 断言a不是b的实例 |
执行测试
执行测试全局执行测试使用" unittest.main()"方法
如下测试用例,用到了上文中的使用原则,继承了unittest.TestCase同时测试方法以test开头,且增加了测试类setUpClass、tearDownClass及测试方法setUp、tearDown
# 引入unittest模块
import unittest
# 创建测试类,继承unittest.TestCase
class TestApi(unittest.TestCase):
# 测试方法,每执行一次test的测试方法就会执行一次
def setUp(self) -> None:
print("setUp方法")
def tearDown(self) -> None:
print("tearDown方法")
# 测试类,以@classmethod修饰测试类,且在过程中仅执行一次
# 如果遇到问题请联系我,添v加x:test_shancha01 私信公众号:程序员山茶
@classmethod
def setUpClass(cls) -> None:
print("setUpClass每个类执行一次")
@classmethod
def tearDownClass(cls) -> None:
print("tearDownClass每个类执行一次")
def test_01(self):
a = 1
b = 2
c = a + b
# 断言 判断c和3是否相同
self.assertEqual(c, 3)
def test_02(self):
a = 2
b = 3
c = a * b
#断言 判断c和6是否相同
self.assertEqual(c, 6)
if __name__ == '__main__':
# 执行所有的以test为开头的测试用例
unittest.main()
作者简介:
程序员山茶,一个工作5年,并坚持探索测试之路的测试开发工程师。曾混迹于互联网大厂、IOTA行业领航企业、安全行业、大数据行业领航企业,欢迎和我一起沟通交流。
欢迎关注我, ?和我一起探索测试之路,终身成长
?