深拷贝和浅拷贝的主要区别在于复制对象时是否复制了引用的对象:
浅拷贝(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
- 1
然后在测试代码中使用@data装饰器:
from ddt import ddt, data
@ddt
class TestMyAPI(unittest.TestCase):
@classmethod
def setUpClass(cls):
cls.base_url = “http://example.com/api”
@data((1, 200), (2, 200), (999, 404)) # 测试数据元组,每个元组包含(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装饰器通常与ddt(Data-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”}, 200),
({“username”: “Bob”, “password”: “invalid_password”}, 401),
({“username”: “”, “password”: “”}, 400),
({“username”: None, “password”: None}, 400),
)
def test_login(self, login_data, expected_status_code):
url = f"{self.base_url}/login"
response = requests.post(url, json=login_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, f"Expected 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, f"Key ‘{key}’ not found in JSON response"
assert json_data[key] == value, f"Value 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, f"Key ‘{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, 200)
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响应中是否存在一组指定的键。
在测试用例中,我们可以直接调用这些封装好的断言方法,使得测试代码更加清晰和简洁。当然,你还可以根据实际需求添加更多的自定义断言方法。这样的封装方式也有助于在多个测试用例中复用相同的断言逻辑,提高代码的复用性。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数软件测试工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年软件测试全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上软件测试开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注软件测试)
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注软件测试)
[外链图片转存中…(img-t3z6wlkp-1712909415893)]
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!