一、如何进行接口测试用例的设计?
在进行接口测试用例设计时,首先需要了解接口的功能和返回值。然后根据需求文档或API文档,对每个接口进行分类,例如基础接口、业务接口、边界条件接口等。
接着,针对每个接口,可以从以下几个方面考虑:
1. 输入参数:测试用例的设计应该覆盖到接口所有的输入参数,包括输入值为空、输入值非法、特殊字符等情况。
2. 返回结果:测试用例应该考虑到所有可能的返回结果,包括成功返回、失败返回、错误码等。
3. 接口性能:可能需要对接口的响应时间、吞吐量等进行测试。
4. 接口安全:可能需要对接口的权限控制、身份验证等进行测试。
5. 其他:一些需要考虑的特殊情况,例如网络异常、服务器宕机等。
# 以请求方法为分类的测试用例模板
import pytest
import requests
# 测试用例-GET请求
@pytest.mark.parametrize("url, expect_code", [
("https://api.github.com/",200),
("https://api.github.com/users/octocat/orgs",200),
("https://api.github.com/404",404)
])
def test_get(url, expect_code):
r = requests.get(url)
assert r.status_code == expect_code
# 测试用例-POST请求
@pytest.mark.parametrize("url, payload, expect_code", [
("https://httpbin.org/post", {"key1": "value1", "key2": "value2"}, 200),
("https://httpbin.org/status/500", {"key1": "value1", "key2": "value2"}, 500)
])
def test_post(url, payload, expect_code):
r = requests.post(url, json=payload)
assert r.status_code == expect_code
二、如何处理接口返回结果?
接口测试中,返回结果的处理是至关重要的。在设计测试用例时,要考虑预期结果的构造,以及实际结果和预期结果的比对。
通常,接口的返回结果可以包含以下几个部分:
1. 返回码:表示接口调用的成功或失败
2. 返回信息:对返回码的详细解释,例如错误原因、错误信息等。
3. 返回数据:根据接口的具体功能而定,可以是json串、xml、html等。
对于RESTful API,通常会使用json作为数据交换格式,处理返回结果时,可以使用Python自带的json库来解析json。
import requests
import json
def test_api():
# 发起请求
url = "http://test.api.com/api/v1/login"
data = {"username": "test", "password": "123456"}
r = requests.post(url, json=data)
# 解析返回结果
response = json.loads(r.text)
# 断言
assert response["code"] == 0
assert response["msg"] == "登录成功"
三、如何处理接口依赖?
在进行接口测试时,有时候会出现接口之间的依赖关系,例如登录接口成功后才能操作其他接口。这时候,我们需要解决接口之间的依赖问题。
解决接口依赖的方法有很多,例如:
1. 在测试用例中依次调用多个接口。
2. 使用Python的unittest框架,利用setUp()和tearDown()方法,在不同的测试用例中共享数据。
3. 使用pytest插件pytest-ordering,按照指定的顺序执行测试用例。
import requests
import pytest
# 登录接口
def login():
url = "http://test.api.com/api/v1/login"
data = {"username": "test", "password": "123456"}
r = requests.post(url, json=data)
token = r.json()["data"]["token"]
return token
# 其他接口
def test_api_with_token(token):
url = "http://test.api.com/api/v1/message"
headers = {"Authorization": "Bearer " + token}
r = requests.get(url, headers=headers)
assert r.status_code == 200
# 测试用例-登录 -> 其他接口
def test_login(test_api_with_token):
token = login()
test_api_with_token(token)
四、如何优化接口自动化测试?
在进行接口自动化测试时,我们需要考虑优化测试过程,包括以下几个方面:
1. 代码重用性高:在编写测试代码时,尽量遵循DRY原则(即不要重复自己)。可以抽象一些常用的方法或工具类,避免重复编写代码。
2. 测试数据统一管理:测试数据尽量采用数据驱动的方式管理,将测试数据和测试逻辑分离开来,便于管理和维护。
3. 日志和报告的规范化:编写规范化的日志和测试报告,便于开发人员和测试人员查看测试结果和分析问题。
4. 引入高效的工具和框架:例如Requests、Unittest、Pytest等,可以加快接口测试的速度。
# 请求封装类
class Request:
def __init__(self, url, data=None, headers=None):
self.url = url
self.data = data
self.headers = headers
def send(self, method):
if method.upper() == "GET":
r = requests.get(self.url, headers=self.headers)
elif method.upper() == "POST":
r = requests.post(self.url, data=self.data, headers=self.headers)
else:
raise Exception("请求方法错误!")
return r
# 测试套件
class APITestCase(unittest.TestCase):
def setUp(self):
self.base_url = "http://test.api.com"
self.login_url = "/api/v1/login"
self.other_url = "/api/v1/message"
def test_login(self):
url = self.base_url + self.login_url
data = {"username": "test", "password": "123456"}
r = Request(url, data)
response = r.send("POST")
self.assertEqual(response.status_code, 200)
self.assertIn("token", response.json()["data"])
def test_api_with_token(self):
url = self.base_url + self.other_url
headers = {"Authorization": "Bearer " + self.token}
r = Request(url, headers=headers)
response = r.send("GET")
self.assertEqual(response.status_code, 200)
def tearDown(self):
pass
if __name__ == '__main__':
unittest.main()