本文共 4524 字,大约阅读时间需要 15 分钟。
unittest是Python内置的单元测试框架,基于Java的junit测试框架。它是Python程序员进行接口自动化测试、功能测试的首选工具之一。许多开发者会选择unittest来编写测试用例,因为它开源且无需安装,灵活性高。
下面,我将为你展示如何在Python中使用unittest以及它的使用场景。
unittest提供了一系列工具,帮助开发者更好地组织和运行测试用例。相比于不使用测试框架的做法,使用unittest可以解决以下问题:
unittest主要由以下几个部分组成:
下面我们以一个接口自动化测试的案例为例,来展示如何编写ittest用例。
我们先创建一个名为test_user_login.py
的文件。
文件内容:
import unittestimport requestsclass TestUserLogin(unittest.TestCase): # 用户登录接口地址 url = 'http://example.com/api/user/login/' def test_user_login(self): data = { "username": "testuser", "password": "testpass123" } response = requests.post(url=self.url, json=data) # 断言响应状态码 self.assertEqual(response.status_code, 200) def test_user_password_error(self): data = { "username": "testuser", "password": "wrongpassword" } response = requests.post(url=self.url, json=data) # 断言响应内容 self.assertIn("密码错误", response.text)if __name__ == '__main__': unittest.main(verbose=2)
在这个测试用例中:
TestUserLogin
继承自unittest.TestCase
。test_
开头,方法名称也要遵循命名规则。assertEqual
用于状态码比较。.assertIn
用于检查响应内容。unittest提供了丰富的断言方法,可以满足大多数测试需求。以下是一些常用的断言方法:
相等性断言:
assertEqual(a, b)
:断言两个值相等。assertNotEqual(a, b)
:断言两个值不等。对象断言:
assertedIs(a, b)
:断言a
和b
是同一个对象。assertIsNot(a, b)
:断言a
和b
不相等。包含性断言:
assertIn(a, b)
:断言a
包含在b
中。assertNotIn(a, b)
:断言a
不包含在b
中。数量、类型和范围的断言:
assertGreater(a, b)
:断言a
大于b
。assertLess(a, b)
:断言a
小于b
。assertGreaterEqual(a, b)
:断言a
大于等于b
。真假断言:
assertTrue(a)
:断言a
为真。assertFalse(a)
:断言a
为假。类型判定:
assertIsInstance(a, Type)
:断言a
是Type
的实例。编写一个优质的测试用例需要以下几个步骤:
requests
库)发送请求。除了直接使用unittest.main()
运行测试类之外,我们可以通过TestSuite
和TestLoader
灵活组织用例。
import unittestdef test_function(): # 定义用例逻辑 pass# 创建测试类class TestMyFunction(unittest.TestCase): def test_function(self): # 测试逻辑 pass# 执行所有测试(从当前目录查找以test开头的*.py文件)unittest.main()
import unittestfrom test_user_login import TestUserLogin# 创建测试套件suite = unittest.TestSuite()# 添加测试用例suite.addTests([TestUserLogin('test_user_login_normal'), TestUserLogin('test_user_login_password_error')])# 执行测试套件unittest TextTestRunner(verbosity=3).run(suite)
import unittest# 创建测试套件suite = unittest.defaultTestLoader.discover('.', pattern='test*.py')# 执行测试unittest.TextTestRunner(verbosity=3).run(suite)
TestLoader 是一个灵活的测试用例加载器,可以根据需要添加不同的加载策略。
示例:从多个文件中加载测试用例。
import unittestfrom test_user_login import TestUserLoginfrom test_user_reg import TestUserReg# 创建两个测试套件suite1 = unittest.TestSuite()suite1.addTest(TestUserLogin('test_user_login_normal'))suite2 = unittest.TestSuite()suite2.addTests([ TestUserReg('test_user_reg_normal'), TestUserReg('test_user_reg_password_error')])# 创建一个包含两个测试套件的测试套件main_suite = unittest.TestSuite([suite1, suite2])# 运行所有用例unittest.TextTestRunner(verbosity=2).run(main_suite)
假设你有一个依赖于外部资源的测试用例,且不想重复运行。可以使用@skipIf
装饰器跳过这些测试。
from unittest import TestCasefrom unittest.skip import skipIfclass MyTest(TestCase): @skipIf(lambda: False, "跳过了某些测试") def test_something(self): # realize的测试逻辑 pass
你也可以通过配置python -m unittest --skipUvs
参数,跳过特定的测试用例。
在unittest中,if __name__ == '__main__':
是执行测试的标准做法。它确保当外部模块调用该测试类时,不会执行main()
函数。
示例:
import unittestclass TestMyClass(unittest.TestCase): def test_my_method(self): # 测试逻辑 passif __name__ == '__main__': unittest.main()
在某些情况下,我们可能需要跳过某些测试。可以使用unittest.skip
装饰器。
from unittest import TestCase, skipIfimport platformclass MyTest(TestCase): @skipIf(platform.system() != 'Linux', "仅在Linux上运行") def test_something(self): # 测试逻辑 pass
通过本文的内容,你已经掌握了unittest的使用方法。无论是编写单个用例,还是组织成复杂的测试套件,unittest都能满足需求。如果你在实际开发中遇到问题,可以参考官方文档进一步学习。
转载地址:http://fiwwk.baihongyu.com/