测试之家

如何用python写一个接口自动化的框架

2023-02-24  本文已影响0人  老林说测试

要写一个接口自动化的框架,可以使用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会自动下载代码并运行测试,将测试结果反馈给开发人员。

上一篇 下一篇

猜你喜欢

热点阅读