您的位置:

Python接口自动化测试面试题解析

一、如何进行接口测试用例的设计?

在进行接口测试用例设计时,首先需要了解接口的功能和返回值。然后根据需求文档或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()