推广自动化的波折

推广自动化的波折前言:

刚来公司不久,跟Leader说,我有自动化经验,我想尝试一下自动化测试,这样可以提高回归测试测试效率,想不到Leader也有这想法,于是乎我就干起了。

 

Python3+pytest+allure

步骤驱动:

因为全部的数据都是通过操作mysql创建的,数据关系到不同的数据库,若每条数据都需要自己查询在哪个数据库上执行这样是非常费时间的,很适合采用步骤驱动来解决。

数据yaml文件如下:

test_01:
  - setup_class:
      # 设置client_id生效
      - UPDATE test2_tmstrategy.strategies set 
      - UPDATE test2_tmstrategy.strategies set 
  - setup:
      # 删除原有的持仓
      - UPDATE test2_tmtradesys.tm_strategy_position set 
      # 清除订单
      - DELETE FROM test2_tmtradesys.tm_order where 
      - UPDATE test2_tmtradesys.tm_order set 
      # 设置可用金额为30万
      - UPDATE test2_tmtradesys.tm_strategybase set 

驱动封装函数:

    def execute(self, sql_list: list):
        """
        执行输入的mysql语句
        :param sql_list: list mysql语句
        :return: 执行结果
        """
        for d in sql_list:
            if 'histates_sz_test' in d:
                return self._db['histates_sz_test'].execute(d)
            elif 'test2_tmstrategy' in d:
                return self._db['test2_tmstrategy'].execute(d)
            elif 'test2_tmtradesys' in d:
                return self._db['test2_tmtradesys'].execute(d)
            elif 'tm_strategy_dc_test' in d:
                return self._db['tm_strategy_dc_test'].execute(d)

这样就不用关注每条sql语句是对应哪个数据库应该在哪个数据库执行,这些都在底层封装好判断和调用执行。

 

分层思想:

底层封装:这层主要是对mysql数据库连接,execute对应不同返回结果的封装,代码

import pymysql
import yaml


class DataBase(object):
    def __init__(self, config):
        """
        初始化mysql连接
        :param config: 配置如{
            "host": "",
            "port": 3306,
            "user": "",
            "password": "",
            "database": "",
            "charset": "utf8",
            "autocommit": True,
        }
        """
        self._connect = pymysql.connect(**config)
        self._cursor = self._connect.cursor()

    def execute(self, sql):
        self._cursor.execute(sql)
        return self._cursor.fetchall()

    def execute_return_json(self, sql):
        """
        返回json格式的结果
        :param sql: mysql语句
        :return: [{},{}]
        """
        self._cursor.execute(sql)
        keys = []
        for column in self._cursor.description:
            keys.append(column[0])
        key_number = len(keys)

        json_data = []
        for row in self._cursor.fetchall():
            item = dict()
            for q in range(key_number):
                item[keys[q]] = row[q]
            json_data.append(item)
        return json_data

    def close(self):
        self._connect.close()
        self._cursor.close()


class YamlData(object):

    @staticmethod
    def yaml_load(path):
        with open(path) as f:
            return yaml.safe_load(f)

数据层:采用yaml文件管理,个别也用python文件存放数据

扩展:

这里对不同数据文件的对比:excel:不推荐,因为不适用多层嵌套数据,而且对数值类型的数据管理有点麻烦,需要修改该格的类型,麻烦。

Json:推荐,json适合多语言,结构明了,不足之处在于json要写很多双引号,对格式要求严格。

Yaml:推荐,yaml也适用多语言,跟json不同在于yaml写起来更轻松,而且可以复用。

python文件:推荐,直接存放python类型的数据,这样连读取数据文件的代码都省了,以前在深信服,老师就推荐我使用这种做法。

 

用例层:pytest测试用例

报告层:存放allure测试报告

 

docker +jenkins集成

# todo

 

评估:

框架上是可行的

每个用例构造的数据:构造步骤多,数据量多

对于策略产品的测试,前期投入成本高,收益少,维护成本高;很适用于清算、核对账目的工具测试。

不足点:

优点:

建议:

 

上一篇:SALAlchemy的事务操作-Connection


下一篇:数据表备份