核心内容摘要
Flowise生产环境:PostgreSQL持久化部署最佳实践
点击文末小卡片免费获取软件测试全套资料资料在手涨薪更快在Python接口测试实践中参数化测试、数据驱动测试和断言是常用的技术手段。
参数化测试参数化测试是指将测试用例中的某些部分如输入数据或配置作为参数传递给测试函数以便于复用和减少代码重复。
例如使用unittest库进行参数化测试import unittest class TestMyAPI(unittest.TestCase): classmethod def setUpClass(cls): cls.base_url http://example.com/api def test_get_user(self, user_id): url f{self.base_url}/users/{user_id} response requests.get(url) self.assertEqual(response.status_code,
# 断言状态码为200 if __name__ __main__: suite unittest.TestSuite() for user_id in [1, 2, 3]: suite.addTest(TestMyAPI(test_get_user, user_iduser_id)) runner unittest.TextTestRunner() runner.run(suite)在这个例子中我们为test_get_user方法添加了参数user_id并在主程序中通过循环为不同的用户ID创建并运行测试用例。
在参数使用的过程中要注意到python深拷贝浅拷贝在接口自动化里的使用在Python的接口自动化测试中深拷贝和浅拷贝的概念主要应用于数据处理和对象复制的场景。
以下是在接口自动化中可能使用深拷贝和浅拷贝的一些情况配置和参数管理在进行接口测试时我们经常需要处理各种配置信息和输入参数。
如果这些数据结构包含嵌套的对象如字典、列表或其他自定义类实例那么在修改或扩展这些数据时可能会涉及到对象的复制操作。
测试数据准备在进行数据驱动测试时我们需要为不同的测试用例准备不同的输入数据。
使用深拷贝或浅拷贝可以创建原始数据结构的副本以避免对原始数据的修改影响到其他测试用例。
响应结果验证在接收和处理接口返回的结果时我们通常会对结果进行断言验证。
如果需要保存原始响应结果以便后续分析或调试使用深拷贝可以确保在后续操作中不会意外修改原始响应数据。
复用和共享对象在编写可复用的测试函数或类时可能会涉及到对象的共享和复制。
使用深拷贝或浅拷贝可以根据需求创建独立的对象副本以避免不同测试之间的数据冲突。
深拷贝和浅拷贝的主要区别在于复制对象时是否复制了引用的对象浅拷贝shallow copy只复制了对象的第一层引用对于嵌套的对象只会创建新的引用而不复制其内容。
这意味着如果修改了浅拷贝后的嵌套对象会影响到原始对象。
深拷贝deep copy不仅复制了对象本身还递归地复制了所有嵌套的对象。
因此修改深拷贝后的对象不会影响到原始对象。
在接口自动化测试中具体使用深拷贝还是浅拷贝取决于具体的测试场景和需求。
例如如果你希望完全隔离测试数据或响应结果避免相互影响那么应该使用深拷贝。
而如果数据结构比较简单或者不需要保持原始数据的完整性那么浅拷贝可能就足够了。
在Python中可以使用copy模块提供的copy()函数进行浅拷贝使用deepcopy()函数进行深拷贝。
以下是一个简单的例子import copy # 假设我们有一个包含嵌套字典的响应结果 response_data { user: { id: 1, name: Alice }, items: [{id: 1, name: Item 1}] } # 使用浅拷贝 copied_data1 copy.copy(response_data) # 使用深拷贝 copied_data2 copy.deepcopy(response_data) # 修改复制后的数据 copied_data1[user][name] Bob copied_data2[user][name] Charlie # 浅拷贝会改变原始数据 print(response_data) # 输出{user: {id: 1, name: Bob}, items: [{id: 1, name: Item 1}]} # 深拷贝不会改变原始数据 print(response_data) # 输出{user: {id: 1, name: Alice}, items: [{id: 1, name: Item 1}]}数据驱动测试数据驱动测试是一种测试方法其中测试数据是从外部数据源如文件、数据库或列表获取的而不是硬编码在测试代码中。
使用unittest库结合ddt库进行数据驱动测试 首先安装ddt库pip install ddt然后在测试代码中使用data装饰器from ddt import ddt, data ddt class TestMyAPI(unittest.TestCase): classmethod def setUpClass(cls): cls.base_url http://example.com/api data((1,
, (2,
, (999,
) # 测试数据元组每个元组包含(user_id, expected_status_code) def test_get_user(self, user_id, expected_status_code): url f{self.base_url}/users/{user_id} response requests.get(url) self.assertEqual(response.status_code, expected_status_code) if __name__ __main__: unittest.main()在这个例子中我们使用data装饰器定义了一个包含多个测试数据元组的列表每个元组代表一次测试用例。
在Python的接口自动化测试中data装饰器通常与ddtData-Driven Tests库一起使用以实现数据驱动的测试。
以下是在接口自动化中data装饰器的一些其他使用方式多场景测试data装饰器可以用来定义多个测试数据集每个数据集代表一个特定的测试场景。
这使得测试代码更具可读性和可维护性因为每个测试场景都在单独的数据集中清晰地定义。
边界值分析在接口测试中经常需要对输入参数进行边界值分析以确保系统在极端情况下也能正确工作。
使用data装饰器可以方便地定义一组包含边界值和特殊值的数据集对这些情况进行测试。
异常和错误处理测试通过使用data装饰器提供不同的输入数据可以测试接口在接收到无效或错误数据时的处理能力。
这包括测试错误消息的返回、状态码的正确性以及系统的稳健性。
性能和负载测试数据准备在进行性能和负载测试时可能需要生成大量不同的请求参数和数据组合。
使用data装饰器可以轻松地创建这些测试数据集并在测试脚本中复用。
配置和环境切换如果你的接口自动化测试需要在不同的环境如开发、测试、生产或者不同的配置下运行可以使用data装饰器来定义不同的环境或配置参数。
这样可以在同一个测试函数中处理多种情况而不需要为每个环境或配置编写单独的测试。
以下是一个使用data装饰器进行多场景测试的例子from ddt import ddt, data ddt class TestMyAPI(unittest.TestCase): classmethod def setUpClass(cls): cls.base_url http://example.com/api data( ({username: Alice, password: password123},
, ({username: Bob, password: invalid_password},
, ({username: , password: },
, ({username: None, password: None},
, ) def test_login(self, login_data, expected_status_code): url f{self.base_url}/login response requests.post(url, jsonlogin_data) self.assertEqual(response.status_code, expected_status_code)在这个例子中我们使用data装饰器定义了四个测试数据集每个数据集包含一个登录请求的数据字典和一个预期的HTTP状态码。
测试函数test_login会针对每个数据集执行一次从而覆盖多种登录场景包括正常登录、无效密码、空输入和无效类型的数据。
断言的使用断言是在测试代码中用来验证实际结果是否符合预期的一种机制。
如果断言失败测试也将失败并提供有关失败原因的信息。
Python的unittest库提供了多种断言方法如assertEqual(a, b): 验证a和b是否相等。
assertTrue(x): 验证x是否为真。
assertFalse(x): 验证x是否为假。
assertIn(item, container): 验证item是否在container中。
assertIsInstance(obj, classinfo): 验证obj是否为classinfo类的实例。
在上面的测试示例中我们使用了assertEqual来验证HTTP响应的状态码是否为预期值。
通过结合使用参数化测试、数据驱动测试和断言你可以更有效地编写和维护Python接口测试代码提高测试覆盖率和代码复用性。
在Python中我们可以封装断言以提高测试代码的可读性和可维护性。
以下是一个简单的断言封装示例class CustomAssertions: staticmethod def assert_status_code(response, expected_status_code): assert response.status_code expected_status_code, fExpected status code {expected_status_code}, got {response.status_code} staticmethod def assert_json_contains(response, key, value): json_data response.json() assert key in json_data, fKey {key} not found in JSON response assert json_data[key] value, fValue of key {key} is {json_data[key]}, expected {value} staticmethod def assert_json_keys_exist(response, keys): json_data response.json() for key in keys: assert key in json_data, fKey {key} not found in JSON response # 添加更多自定义断言方法...# 使用示例from unittest import TestCase import requests class MyTestCase(TestCase): def test_my_api(self): response requests.get(http://example.com/api) CustomAssertions.assert_status_code(response,
CustomAssertions.assert_json_contains(response, name, John Doe) CustomAssertions.assert_json_keys_exist(response, [name, email, age])在这个例子中我们创建了一个名为CustomAssertions的类其中包含了一些静态方法每个方法都是一个封装好的断言。
这些断言方法包括assert_status_code: 断言HTTP响应的状态码是否为预期值。
assert_json_contains: 断言JSON响应中是否存在指定的键并且该键的值等于预期值。
assert_json_keys_exist: 断言JSON响应中是否存在一组指定的键。
在测试用例中我们可以直接调用这些封装好的断言方法使得测试代码更加清晰和简洁。
当然你还可以根据实际需求添加更多的自定义断言方法。
这样的封装方式也有助于在多个测试用例中复用相同的断言逻辑提高代码的复用性。
最后感谢每一个认真阅读我文章的人礼尚往来总是要有的虽然不是什么很值钱的东西如果你用得到的话可以直接拿走这些资料对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库这个仓库也陪伴我走过了最艰难的路程希望也能帮助到你凡事要趁早特别是技术行业一定要提升技术功底。