如何用python写一个接口自动化的框架
要写一个接口自动化的框架,可以使用Python中的requests和unittest库来实现。
1.安装requests和unittest库
在命令行中使用pip安装requests和unittest库:
pip install requests
pip install unittest
2.创建测试用例
使用unittest库来创建测试用例,在创建测试用例之前,需要先导入unittest库和requests库:
import unittest
import requests
接下来,创建一个测试类,并继承unittest.TestCase类:
class TestAPI(unittest.TestCase):
def test_case1(self):
# 测试用例1的代码
pass
def test_case2(self):
# 测试用例2的代码
pass
在每个测试用例中,可以编写需要测试的接口请求代码,并使用assert断言来判断接口的返回结果是否符合预期。
例如,编写一个测试用例来测试获取用户列表的接口:
class TestAPI(unittest.TestCase):
def test_get_user_list(self):
url = 'http://api.example.com/user/list'
headers = {'Content-Type': 'application/json'}
response = requests.get(url, headers=headers)
# 判断接口返回的状态码是否为200
self.assertEqual(response.status_code, 200)
# 判断接口返回的数据是否符合预期
expected_data = {'status': 'success', 'data': [{'name': 'user1', 'age': 20}, {'name': 'user2', 'age': 25}]}
self.assertEqual(response.json(), expected_data)
3.创建测试套件
将所有的测试用例组合成测试套件,使用unittest.TestSuite()方法来创建一个测试套件,然后使用addTest()方法将测试用例添加到测试套件中。
def suite():
suite = unittest.TestSuite()
suite.addTest(TestAPI('test_get_user_list'))
suite.addTest(TestAPI('test_case2'))
return suite
4.运行测试套件
使用unittest.TextTestRunner()方法来运行测试套件,并打印测试结果。
if __name__ == '__main__':
runner = unittest.TextTestRunner()
runner.run(suite())

5.完整代码示例
import unittest
import requests
class TestAPI(unittest.TestCase):
def test_get_user_list(self):
url = 'http://api.example.com/user/list'
headers = {'Content-Type': 'application/json'}
response = requests.get(url, headers=headers)
# 判断接口返回的状态码是否为200
self.assertEqual(response.status_code, 200)
# 判断接口返回的数据是否符合预期
expected_data = {'status': 'success', 'data': [{'name': 'user1', 'age': 20}, {'name': 'user2', 'age': 25}]}
self.assertEqual(response.json(), expected_data)
def test_case2(self):
# 测试用例2的代码
pass
def suite():
suite = unittest.TestSuite()
suite.addTest(TestAPI('test_get_user_list'))
suite.addTest(TestAPI('test_case2'))
return suite
if __name__ == '__main__':
runner = unittest.TextTestRunner()
runner.run(suite())
6.封装测试用例
在实际的测试场景中,有很多测试用例都会用到相同的请求头、请求参数等信息,如果每个测试用例都单独编写这些信息,会造成代码冗余,增加维护成本。
因此,我们可以将这些公共信息封装成一个类,然后在每个测试用例中调用该类的方法来获取请求头、请求参数等信息。
例如,创建一个名为APITest的类来封装请求信息:
class APITest:
headers = {'Content-Type': 'application/json'}
@staticmethod
def get(url, params=None):
return requests.get(url, params=params, headers=APITest.headers)
@staticmethod
def post(url, data=None, json=None):
return requests.post(url, data=data, json=json, headers=APITest.headers)
然后,在测试用例中调用APITest类的方法来发送请求:
class TestAPI(unittest.TestCase):
def test_get_user_list(self):
url = 'http://api.example.com/user/list'
response = APITest.get(url)
# 判断接口返回的状态码是否为200
self.assertEqual(response.status_code, 200)
# 判断接口返回的数据是否符合预期
expected_data = {'status': 'success', 'data': [{'name': 'user1', 'age': 20}, {'name': 'user2', 'age': 25}]}
self.assertEqual(response.json(), expected_data)
def test_create_user(self):
url = 'http://api.example.com/user/create'
data = {'name': 'user3', 'age': 30}
response = APITest.post(url, json=data)
# 判断接口返回的状态码是否为200
self.assertEqual(response.status_code, 200)
# 判断接口返回的数据是否符合预期
expected_data = {'status': 'success'}
self.assertEqual(response.json(), expected_data)
7.使用数据驱动测试
数据驱动测试是一种测试方法,它可以让同一个测试用例使用不同的数据进行多次测试,从而提高测试覆盖率。
在Python中,可以使用unittest库的subTest()方法来实现数据驱动测试。
例如,编写一个测试用例来测试用户登录接口,使用不同的用户名和密码进行多次测试:
class TestAPI(unittest.TestCase):
def test_user_login(self):
url = 'http://api.example.com/user/login'
test_data = [
{'username': 'user1', 'password': '123456', 'expected_result': {'status': 'success'}},
{'username': 'user2', 'password': 'abcdef', 'expected_result': {'status': 'fail', 'message': 'Incorrect password'}},
{'username': 'user3', 'password': '123456', 'expected_result': {'status': 'fail', 'message': 'User not exists'}},
]
for data in test_data:
with self.subTest(data=data):
response = APITest.post(url, data=data)
# 判断接口返回的状态码是否为200
self.assertEqual(response.status_code, 200)
# 判断接口返回的数据是否符合预期
expected_data
expected_data = data['expected_result']
self.assertEqual(response.json(), expected_data)
使用subTest()方法可以将每次测试的数据作为子测试进行运行,如果有多组测试数据,当其中一组数据失败时,也不会影响其他数据的测试结果。
8. 使用Mock模拟接口响应
在进行接口测试时,如果测试的接口依赖于其他接口或者外部服务,那么就需要在测试时考虑这些依赖关系。如果这些依赖的接口或服务没有准备好,或者测试环境无法访问这些依赖,那么就会影响测试结果。
为了解决这个问题,可以使用Mock模拟接口响应,以便在测试环境中独立运行测试用例。
Python中有很多Mock库可以使用,例如unittest.mock和pytest-mock等。
例如,使用unittest.mock库来模拟一个返回成功响应的接口:
from unittest.mock import patch
class TestAPI(unittest.TestCase):
@patch('requests.post')
def test_create_user(self, mock_post):
url = 'http://api.example.com/user/create'
data = {'name': 'user1', 'age': 20}
expected_data = {'status': 'success'}
mock_response = mock_post.return_value
mock_response.status_code = 200
mock_response.json.return_value = expected_data
response = APITest.post(url, json=data)
# 判断接口返回的状态码是否为200
self.assertEqual(response.status_code, 200)
# 判断接口返回的数据是否符合预期
self.assertEqual(response.json(), expected_data)
# 判断Mock的方法是否被调用
mock_post.assert_called_once_with(url, json=data, headers=APITest.headers)
使用patch()函数可以替换掉requests.post()函数,使得在测试时返回的是一个Mock对象,可以通过设置Mock对象的属性来模拟接口的响应。
使用测试报告
测试报告可以帮助我们更好地了解测试结果和测试覆盖率,以便在测试结束后进行分析和统计。
Python中有很多测试报告库可以使用,例如unittest库自带的HTMLTestRunner、pytest-html和allure-pytest等。
例如,使用HTMLTestRunner来生成测试报告:
import HTMLTestRunner
if __name__ == '__main__':
suite = unittest.TestSuite()
suite.addTests(unittest.defaultTestLoader.loadTestsFromTestCase(TestAPI))
with open('test_report.html', 'wb') as f:
runner = HTMLTestRunner.HTMLTestRunner(stream=f, title='API Test Report', description='This is a report of API test.')
runner.run(suite)
使用HTMLTestRunner可以将测试结果生成一个HTML格式的报告,方便查看和分享。
使用持续集成工具
持续集成工具可以将代码仓库与自动化测试框架集成起来,实现代码提交自动触发测试,并将测试结果反馈给开发团队。
常用的持续集成工具有Jenkins、Travis CI和CircleCI等。
以Travis CI为例,以下是一个在Travis CI上运行Python自动化测试的示例配置文件:
yaml
Copy code
language: python
python:
- "3.6"
- "3.7"
- "3.8"
install:
- pip install -r requirements.txt
script:
- pytest
notifications:
email:
recipients:
- email@example.com
on_success: never
on_failure: always

在这个配置文件中,指定了要测试的Python版本,安装了所需的依赖库,运行了pytest命令进行测试,并配置了邮件通知,以便在测试失败时及时通知开发人员。
在Travis CI上设置好配置文件后,每当有代码提交到代码仓库时,Travis CI会自动下载代码并运行测试,将测试结果反馈给开发人员。