自动化测试用例
自动化测试用例¶
这里根据手工测试用例从 P0,P1,P2 级别的用例中选择一部分实现自动化测试。
目标¶
- 准确性:保证接口的实际效果符合预期效果,且数据传输准确无误。
- 性能优化:通过接口测试来评估系统性能,如响应时间、并发处理能力等。
- 兼容性:确保接口在不同的环境、设备和网络情况下都能正常工作。
- 安全性:通过接口测试来查找和预防潜在的安全风险。
- 提高软件质量:通过早期发现与修复问题,从而提高软件的质量和稳定性。
步骤¶
-
理解和确定接口的业务需求:一切测试都需要以业务需求为驱动,理解接口的业务逻辑,明确接口的功能需求。
-
设计测试用例:根据接口需求设计出覆盖各种场景的测试用例,包括正常业务流程、异常流程和边界值处理等。
-
设置测试环境:确保测试环境和生产环境尽可能一致,避免因环境问题导致测试结果的无效。
-
执行测试用例:按照设计好的用例执行测试,如果有自动化测试工具,可以实现批量执行。
-
检查测试结果:验证测试结果是否符合预期,记录测试结果并分析问题所在。
-
反馈并跟踪缺陷:将测试中发现的问题以缺陷的形式反馈给开发人员,并进行跟踪直至问题解决。
-
回归测试:修复接口问题后,对接口进行回归测试,验证问题是否被正确修复,并接口的其他功能是否受到影响。
参考示例¶
import allure
import pytest
import requests
from ThingsBoard.util.logger import logger
@allure.epic("物联网设备管理")
class TestTingsBoard:
api = "https://thingsboard.stu.hogwarts.ceshiren.com/api/"
username = "hogwarts1@ceshiren.com"
password = "123456"
def login(self, username, password):
data = {
"username": username,
"password": password
}
url = self.api + 'auth/login'
r = requests.post(url, json=data, verify=False)
return r.json()
@pytest.mark.P0
@allure.feature("【正向验证】添加设备")
@pytest.mark.parametrize('name', ['中', "api自动化测试", "hogwarts", 1234])
def test_add_tingsboard(self, name):
token = self.login(self.username, self.password)['token']
header = {
"X-Authorization": "Bearer " + token
}
url = self.api+"device"
data = {
# 名称
"name": name,
}
r = requests.post(url, json=data, headers=header, verify=False)
logger.info(f"响应的状态码为:{r.status_code}, 添加的设备名称为:{r.json()['name']}")
assert r.status_code == 200
assert r.json()['name'] == f"{name}"
@pytest.mark.P0
@allure.feature("【逆向验证】添加设备")
@pytest.mark.parametrize('name', [' ', None, ''])
def test_add_tingsboard_error(self, name):
token = self.login(self.username, self.password)['token']
header = {
"X-Authorization": "Bearer " + token
}
url = self.api + "device"
data = {
# 名称
"name": name,
}
r = requests.post(url, json=data, headers=header, verify=False)
logger.info(f"响应的状态码为:{r.status_code}")
logger.info(f"响应内容为:{r.json()}")
assert r.status_code == 400
@pytest.mark.P1
@allure.feature("【逆向验证】不传递参数")
def test_not_param_error(self):
token = self.login(self.username, self.password)['token']
header = {
"X-Authorization": "Bearer " + token
}
url = self.api + "device"
r = requests.post(url, headers=header, verify=False)
logger.info(f"响应的状态码为:{r.status_code}")
logger.info(f"响应内容为:{r.json()}")
assert r.status_code == 500
@pytest.mark.P0
@allure.feature("【正向验证】查询设备")
@pytest.mark.parametrize('name', ['中', "api自动化测试", "hogwarts", 1234])
def test_get_tingsboard(self, name):
token = self.login(self.username, self.password)['token']
header = {
"X-Authorization": "Bearer " + token
}
url = self.api + "tenant/devices"
param = {
"deviceName": name
}
r = requests.get(url, params=param, headers=header, verify=False)
logger.info(f"响应的状态码为:{r.status_code}")
logger.info(f"响应内容为:{r.json()}")
assert r.status_code == 200
@pytest.mark.P0
@allure.feature("【逆向验证】查询设备")
@pytest.mark.parametrize('name', [' ', "", None, "gsdhsdghsd"])
def test_get_tingsboard_error(self, name):
token = self.login(self.username, self.password)['token']
header = {
"X-Authorization": "Bearer " + token
}
url = self.api + "tenant/devices"
param = {
"deviceName": name
}
r = requests.get(url, params=param, headers=header, verify=False)
logger.info(f"响应的状态码为:{r.status_code}")
logger.info(f"响应内容为:{r.json()}")
assert r.status_code != 200
@pytest.mark.P1
@allure.feature("【逆向验证】不传递参数")
def test_get_no_param(self):
token = self.login(self.username, self.password)['token']
header = {
"X-Authorization": "Bearer " + token
}
url = self.api + "tenant/devices"
r = requests.get(url, headers=header, verify=False)
logger.info(f"响应的状态码为:{r.status_code}")
logger.info(f"响应内容为:{r.json()}")
assert r.status_code == 400
@pytest.mark.P0
@allure.feature("【正向验证】登录获取token")
def test_login(self):
token = self.login(self.username, self.password)['token']
assert token
@pytest.mark.P0
@allure.feature("【逆向验证】错误的用户信息登录")
def test_login_error(self):
result = self.login("dsafhadf", "13252345")
logger.info(f"响应结果为:{result}")
assert result
assert result['status'] == 401