我们在接口自动化测试时,每个接口传参都不止一个情况,以登录接口为例。一般情况下会考虑正向、逆向组合,所以,一个登录接口就会有很多例,这些用例除了参数以后没什么区别,这个时候就我们就可以利用DDT来管理我们的测试数据。excel.xlsx中最好将一个接口的测试用例放到一个表单中

"""
@Title     ---  selenium +pytest 
@Autgor    ---  fang
@Aphorism  ---  白天撸代码 ,晚上洗霸王 !!!
"""
import unittest
from common.excel_handler import ExcelHandler
from config.setting import config
from libs import ddt
from common.requests_handler import RequestsHandler
import json
from middleware.log_logger import logger
from middleware.helper import replace_label

@ddt.ddt
class TestLogin(unittest.TestCase):

    #从xlsx中获取数据
    excel_handler = ExcelHandler(config.data_path)
    data = excel_handler.read("login")

    def setUp(self) -> None:
        """
        前置条件
        :return:
        """
        self.req =RequestsHandler()

    def tearDown(self) -> None:
       """
       后置条件
       :return:
       """
       self.req.close_session()

    @ddt.data(*data)
    def test_login(self,test_data):
        """
        DDT获取excel数据
        :return: test_data
        通过包含去断言是否正确,需要将预期结果进行转换
        TOOD:通过replace_lable替换动态参数时,context类里面的属性名称必须与excel里面的一致。切记
        """
        test_data['json']= replace_label(test_data['json'])

        res = self.req.visit(config.base_path + test_data['url'],
                             method=test_data['method'],
                             json=json.loads(test_data['json'])
                       )
        case_expect = eval(test_data['expect'])

        try:
            self.assert_dict_item(case_expect,res)
            logger.info('{}-----> 执行通过'.format(test_data['case_name']))
            self.excel_handler.write(config.data_path, 'login', test_data['case_id'] + 1, 8, 'PASS')

        except AssertionError as e:
            logger.info('{}-----> 执行失败{}'.format(test_data['case_name'],e))
            self.excel_handler.write(config.data_path,'login',test_data['case_id']+1,8,'FAIL')
            raise e


    def assert_dict_item(self, dict1, dict2):
        """
        断言dic1中的所有元素都是diac2中的成员,成立返回True,不成立引发断言错误
        :param dic1: 字典
        :param dic2: 字典
        :return:
        """
        for item in dict1.items():
            if item not in dict2.items():
                raise AssertionError("{} items not in {}".format(dict1, dict2))

这样,就可以实现以个批量数据读取,解决了代码的复用性问题。

posted on 2020-05-26 17:29  眼前即是最好  阅读(533)  评论(0)    收藏  举报