【python+unittest 接口自动化测试实战 (五) 】-- 设计测试用例

一、unittest自动化测试结构

二、代码实现

1、导入需要的一些前置方法,用以获取cookie,生成测试数据等

# coding=utf-8
import sys
sys.path.append('..')

# 导入前置方法(登录接口获取cookie;通用的方法,如生成随机字符串、手机号;一些常用的参数设置等)
import PreProcessing as p
from PreProcessing import *

2、初始化 接口地址、机构、用户、数据库等

初始化要查询的数据库,参考https://blog.csdn.net/kk_gods/article/details/109054888


class AntibioticDict(p.unittest.TestCase):  # 继承unittest的TestCase类
    """
    新增抗生素字典测试
    """
    @classmethod
    def setUpClass(cls):
        """
        必须使用@classmethod装饰器,所有case执行的前置条件,只运行一次
        可以根据系统设计、接口特性等,进行测试前的初始化:机构ID, url, 用户ID,cookie,tooken,header等
        :return:
        """
        cls.header, cls.org_id, cls.user_id = p.header, p.org_id, p.user_id  
        cls.url_test = p.base_url + '/api/'
        # 初始化一个查询sql(根据请求参数,查询数据库是否有新增一条相同得数据),用于断言
        cls.sql = """
                        SELECT COUNT(id) AS counts
                        FROM
                            `table1`
                        WHERE
                            org_id = '{}'
                        AND `code` = '{}'
                        AND `name` = '{}'
                        and `is_valid` = '{}'
                        AND create_time LIKE '{}%';                                                 
                        """
        cls.db = p.readconfig.lis_db

 3、初始化请求参数

调用公共函数CommonFunc生成随机字符串、数字,参考https://blog.csdn.net/kk_gods/article/details/109053179


    def setUp(self):
        """
        准备环境,执行每个测试用例的前置条件
        :return:
        """
        # is_valid = p.USE_FLAG
        # 初始化请求参数
        self.params_test = {
            "isTrusted": True,
            "isValid": 1,
            "code": 'code' + p.CommonFunc.random_str,  
            "name": 'name' + p.CommonFunc.random_strs(10),
            "inputCode": p.CommonFunc.random_strs(10),
            "enName": p.CommonFunc.random_strs(10),
            "kbMin": round(p.random.uniform(1, 10), 2),  
            "kbMax": round(p.random.uniform(11, 100), 2),
            "micMin": round(p.random.uniform(1, 10), 2),
            "micMax": round(p.random.uniform(11, 100), 2),
            "remark": p.CommonFunc.random_strs(10),
            "sort": p.random.randint(1, 10),
            "orgId": self.org_id
        }

4、编写测试用例


    
    # 测试用例命名必须以test开头
    def test_antibiotic_dict_001(self):
        """1、【新增字典】新增合法数据;预期:成功"""
        # 发起请求
        r = p.requests.request("post", url=self.__class__.url_test, json=self.params_test, headers=self.__class__.header)
        # 将返回信息转换为json
        test_result = p.json.loads(r.text)
        # msg = p.CommonFunc.get_msg(test_result) # 调用函数,获取msg
        # print(r.elapsed.total_seconds())  # 接口响应时间

        if r.status_code == 200 and test_result['success']: # 判断http状态码和请求返回状态
            # 将请求参数组装到SQL中
            sql = self.__class__.sql.format(
                self.params_test['orgId'], self.params_test['code'], self.params_test['name'],
                self.params_test['isValid'],
                p.CURRENT_DATE
            )
            # 执行SQL,获取数据库新增条数,参考https://blog.csdn.net/kk_gods/article/details/109053646
            counts = p.CommonFunc.get_counts(sql, self.db) 

            # 判断数据库是否新增一条数据:counts等于1,测试用例执行通过;counts不等于1,执行失败,将接口URL、参数以及查询SQL输出
            self.assertEqual(counts, 1, """
                        接口返回成功,但数据库未查询到数据
                        【URL】: {},
                        【PARAMS】: {},
                        【STATUS】: {},
                        【MSG】: {},
                        【SQL】: {} 
                        """.format(r.url, self.params_test, r.status_code, msg, sql))

        else:
            self.assertTrue(
                test_result['success'],
                """
                测试不通过,ERROR
                【URL】: {},
                【PARAMS】: {},
                【STATUS】: {},
                【MSG】: {}
                """.format(r.url, self.params_test, r.status_code, msg))

    # 调用skip()装饰器跳过某个case,
    # @p.unittest.skip("Don't run this case. ") # 无条件跳过
    def test_antibiotic_dict_002(self):
        """2、【新增字典】编码重复;预期:新增失败"""
        r = p.requests.request("post", url=self.__class__.url_test, json=self.params_test, headers=self.__class__.header)
        test_result = p.json.loads(r.text)
        msg = p.CommonFunc.get_msg(test_result)
        if r.status_code == 200:
            self.assertFalse(
                test_result['success'],
                """
                测试不通过,未校验编码是否重复
                【URL】: {},
                【PARAMS】: {},
                【STATUS】: {},
                【MSG】: {}
                """.format(r.url, self.params_test, r.status_code, msg))
        else:
            self.assertFalse(
                test_result['success'],
                """
                测试不通过,ERROR
                【URL】: {},
                【PARAMS】: {},
                【STATUS】: {},
                【MSG】: {}
                """.format(r.url, self.params_test, r.status_code, msg))

    # @unittest.skipIf(condition,reason) # 如果condition为true,则 skip
    def test_antibiotic_dict_003(self):
        """3、【新增字典】max值小于min;预期:新增失败"""
        self.params_test.update(
            {
                "code": 'code' + p.CommonFunc.random_strs(10),
                "kbMin": round(p.random.uniform(11, 100), 2),
                "kbMax": round(p.random.uniform(1, 10), 2),
                "micMin": round(p.random.uniform(11, 110), 2),
                "micMax": round(p.random.uniform(1, 10), 2),
            }
        )

        r = p.requests.request("post", url=self.__class__.url_test, json=self.params_test, headers=self.__class__.header)
        test_result = p.json.loads(r.text)
        msg = p.CommonFunc.get_msg(test_result)
        if r.status_code == 200:
            self.assertFalse(
                test_result['success'],
                """
                测试不通过,未校验KB、MIC值大小关系
                【URL】: {},
                【PARAMS】: {},
                【STATUS】: {},
                【MSG】: {}
                """.format(r.url, self.params_test, r.status_code, msg))
        else:
            self.assertFalse(
                test_result['success'],
                """
                测试不通过,ERROR
                【URL】: {},
                【PARAMS】: {},
                【STATUS】: {},
                【MSG】: {}
                """.format(r.url, self.params_test, r.status_code, msg))

    # @unittest.skipUnless(condition,reason) # 如果condition为False,则skip
    def test_antibiotic_dict_004(self):
        """4、【新增字典】新增不存在的状态,预期:失败"""
        self.params_test.update(
            {
                "code": 'code' + p.CommonFunc.random_strs(10),
                "isValid": 3
            }
        )
        r = p.requests.request("post", url=self.__class__.url_test, json=self.params_test, headers=self.__class__.header)
        test_result = p.json.loads(r.text)
        msg = p.CommonFunc.get_msg(test_result)
        if r.status_code == 200:
            self.assertFalse(
                test_result['success'],
                """
                测试不通过,未校验停启用状态
                【URL】: {},
                【PARAMS】: {},
                【STATUS】: {},
                【MSG】: {}
                """.format(r.url, self.params_test, r.status_code, msg))
        else:
            self.assertFalse(
                test_result['success'],
                """
                测试不通过,ERROR
                【URL】: {},
                【PARAMS】: {},
                【STATUS】: {},
                【MSG】: {}
                """.format(r.url, self.params_test, r.status_code, msg))

    def test_antibiotic_dict_005(self):
        """5、【新增字典】必填字段未填写;预期:新增失败"""
        self.params_test.update(
            {
                "code": None
            }
        )
        r = p.requests.request("post", url=self.__class__.url_test, json=self.params_test, headers=self.__class__.header)
        test_result = p.json.loads(r.text)
        msg = p.CommonFunc.get_msg(test_result)
        if r.status_code == 200:
            self.assertFalse(
                test_result['success'],
                """
                测试不通过,未校验必填字段
                【URL】: {},
                【PARAMS】: {},
                【STATUS】: {},
                【MSG】: {}
                """.format(r.url, self.params_test, r.status_code, msg))
        else:
            self.assertFalse(
                test_result['success'],
                """
                测试不通过,ERROR
                【URL】: {},
                【PARAMS】: {},
                【STATUS】: {},
                【MSG】: {}
                """.format(r.url, self.params_test, r.status_code, msg))

    def test_antibiotic_dict_006(self):
        """6、【新增字典】字段长度超长;预期:新增失败"""
        self.params_test.update(
            {
                "code": 'code' + p.CommonFunc.random_strs(100),
                "name": 'name' + p.CommonFunc.random_strs(100)
            }
        )
        r = p.requests.request("post", url=self.__class__.url_test, json=self.params_test, headers=self.__class__.header)
        test_result = p.json.loads(r.text)
        msg = p.CommonFunc.get_msg(test_result)
        if r.status_code == 200:
            self.assertFalse(test_result['success'],
                             '测试不通过,未校验字段长度;【URL: {}】,【PARAMS: {}】,【MSG: {}】'
                             .format(r.url, self.params_test, msg))
        else:
            self.assertFalse(
                test_result['success'],
                """
                测试不通过,ERROR
                【URL】: {},
                【PARAMS】: {},
                【STATUS】: {},
                【MSG】: {}
                """.format(r.url, self.params_test, r.status_code, msg))

    def test_antibiotic_dict_007(self):
        """7、【新增字典】新增停用状态,预期:成功"""
        self.params_test.update(
            {
                "code": 'code' + p.CommonFunc.random_strs(10),
                "isValid": 0
            }
        )
        r = p.requests.request("post", url=self.__class__.url_test, json=self.params_test,
                               headers=self.__class__.header)
        test_result = p.json.loads(r.text)
        msg = p.CommonFunc.get_msg(test_result)
        if r.status_code == 200:
            self.assertTrue(
                test_result['success'],
                """
                测试不通过,未校验停启用状态
                【URL】: {},
                【PARAMS】: {},
                【STATUS】: {},
                【MSG】: {}
                """.format(r.url, self.params_test, r.status_code, msg))
        else:
            self.assertTrue(
                test_result['success'],
                """
                测试不通过,ERROR
                【URL】: {},
                【PARAMS】: {},
                【STATUS】: {},
                【MSG】: {}
                """.format(r.url, self.params_test, r.status_code, msg))

    def test_antibiotic_dict_007(self):
        """8、【新增字典】"""
        pass

    def tearDown(self):
        """
        环境的恢复还原,执行每个测试用例的后置条件,如:删除测试用例执行的脏数据等
        """
        pass

    @classmethod
    def tearDownClass(cls):
        """
        必须使用@classmethod装饰器,所有case执行的前置条件,只运行一次
        """
        pass

4、运行测试用例



if __name__ == '__main__':
    # verbosity=*:默认是1;设为0,则不输出每一个用例的执行结果;设为2 输出详细的执行结果
    # 为1;执行成功输出为 . ,失败是 F,出错是 E,跳过是 S
    # 为2:打印测试的注释
    p.unittest.main(verbosity=2)

 

 

 

 

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
### 回答1: Pythonunittest库提供了一种基于单元测试的测试框架,是一个方便易用的Python测试框架。使用unittest库进行接口自动化测试可以提高测试效率和质量,本文将分享如何使用Python unittest库搭建接口自动化测试框架。 第一步:安装Python unittest库 首先需要安装Python unittest库,Python unittest库是默认安装在Python中的,无需单独安装。 第二步:安装requests模块 接口自动化测试需要使用requests模块来发送HTTP请求、获取响应等操作,因此需要安装requests模块。使用pip安装requests命令如下: pip install requests 第三步:编写测试用例 使用unittest框架编写测试用例,首先需要导入unittest库并创建测试类,编写测试方法,方法名必须以test开头,并使用assert断言方法进行验证。例如: import unittest import requests class TestApi(unittest.TestCase): def test_get_users(self): url = 'http://localhost:8080/api/users' res = requests.get(url) self.assertEqual(res.status_code, 200) self.assertIsNotNone(res.json()) 第四步:执行测试用例 使用unittest框架执行测试用例,使用unittest.main()方法运行所有测试用例。例如: if __name__ == '__main__': unittest.main() 执行测试用例后,将输出测试结果,包括测试用例总数、成功数、失败数等。 第步:持续集成 持续集成可以帮助实现自动化测试,可以将上述步骤集成到自动化测试框架中,提高测试效率和质量。使用持续集成工具,例如Jenkins,可以实现自动化测试的调度和执行,定期输出测试报告,是测试自动化化的不二选择。 在以上步骤中,请求地址和验证方法需要根据具体需求进行更改,但是编写测试用例的方法是类似的,熟练掌握unittest库可以快速搭建接口自动化测试框架,提高测试效率和质量。 ### 回答2: Python unittest requests 接口自动化测试框架搭建教程博客是指一篇博客文章,介绍如何使用Python unittest与requests库搭建接口自动化测试框架。该教程博客有如下几个方面: 1. 简单介绍Python unittest与requests库,以及它们在接口自动化测试中的使用; 2. 详细讲解如何安装Python unittest和requests库,并编写测试用例; 3. 讲解如何通过使用Python unittest的setUp()和tearDown()方法,在测试用例执行前后进行一些操作,以便更好地进行测试; 4. 介绍如何运行测试用例,并查看测试结果,以及如何进行测试报告生成; 5. 提供一些实例,展示如何使用Python unittest与requests库搭建接口自动化测试框架。 通过这篇教程博客,读者可以学习如何使用Python unittest与requests库搭建接口自动化测试框架,并且能够快速了解并掌握这种接口自动化测试方法的流程和基本方法。此外,该教程博客也提供一些实例,帮助读者更好地理解和应用这种方法。因此,这篇教程博客对于想要学习接口自动化测试以及深入了解Python unittest和requests库的读者来说,是一篇非常有价值的文章。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值