• Cypress web自动化36-cy.exec()执行python查询数据库获取结果(json数据转object对象)


    前言

    cy.exec() 可以执行系统命令行,那么用 python 写个查询 sql 的时候,返回结果是 json 格式。
    cypress 的脚本是 javascript 语言写的,没法直接识别python返回的数据,需用 JSON 解析成 object 对象。

    解决思路

    遇到场景:
    写自动化用例的时候,需要准备测试数据,有些数据是需要动态从数据库中读取,所以会先查询数据库,得到查询结果。
    然后把测试结果用到自动化用例里面关联起来。

    用 python 查询数据库返回的是 list of dict 类型的数据,这只是python里面的数据类型.

    # 注意 这里是单引号,并不是标准的json类型
    [{'name': 'test', 'sex': 'F', 'mail': '283340479@qq.com'}]
    

    所以需转成json格式输出到控制台,如下格式

    # json
    [{"name": "test", "sex": "F", "mail": "283340479@qq.com"}]
    

    cy.exec() 执行命令行后获取到的是字符串类型,字符串类型取值的话不太好取值,最好是先转object对象

    # js object
    [{name: "test", sex: "F", mail: "283340479@qq.com"}]
    

    查询数据库

    # select_sql.py
    import pymysql
    
    '''
    环境安装
    pip install PyMySQL==0.9.3
    作者:上海-悠悠 交流QQ群:939110556
    '''
    
    
    dbinfo = {
        "host": "192.168.1.x",
        "user": "root",
        "password": "123456",
        "port": 3306}
    
    
    class DbConnect():
        def __init__(self, db_cof, database=""):
            self.db_cof = db_cof
            # 打开数据库连接
            self.db = pymysql.connect(database=database,
                                      cursorclass=pymysql.cursors.DictCursor,
                                      **db_cof)
    
            # 使用cursor()方法获取操作游标
            self.cursor = self.db.cursor()
    
        def select(self, sql):
            # SQL 查询语句
            # sql = "SELECT * FROM EMPLOYEE 
            #        WHERE INCOME > %s" % (1000)
            self.cursor.execute(sql)
            results = self.cursor.fetchall()
            return results
    
        def execute(self, sql):
            # SQL 删除、提交、修改语句
            # sql = "DELETE FROM EMPLOYEE WHERE AGE > %s" % (20)
            try:
               # 执行SQL语句
               self.cursor.execute(sql)
               self.cursor.executemany()
               # 提交修改
               self.db.commit()
            except:
               # 发生错误时回滚
               self.db.rollback()
    
        def close(self):
            # 关闭连接
            self.db.close()
    
    if __name__ == '__main__':
        import json
        sql = "select name,sex,mail from apiapp_userpersonalinfo where name='test';"
        db = DbConnect(dbinfo, database="apps")
        result = db.select(sql)
        db.close()
        # 以json格式输出到控制台
        print(json.dumps(result))
    
    

    控制台输出结果是json格式

    [{"name": "test", "sex": "F", "mail": "283340479@qq.com"}]

    json解析

    查询到的结果用 JSON 解析成 object 对象,并传给用例

    /**
     * Created by dell on 2020/5/11.
     * 作者:上海-悠悠 交流QQ群:939110556
     */
    
    describe('执行系统命令查询sql', function() {
        beforeEach(() => {
              cy.exec("python D:\Cypress\cypress\fixtures\select_sql.py")
                  .as("get_result")
                  .then(function(result) {
                      // json解析成object
                    const res_body = JSON.parse(result.stdout)
                    //  示例:打印出来
                    cy.log(res_body)
                    // 断言 返回结果
                    expect(res_body.length).to.be.at.least(1)
            })
    
            })
    
        it("查询结果当用例参数", function() {
            cy.visit('https://www.cnblogs.com/yoyoketang')
            // json解析
            const res_json = JSON.parse(this.get_result.stdout)
            cy.log(res_json)
    
        })
        })
    

    代码执行过程:

    • cy.exec 执行系统命令
    • .as("get_result") 保存执行的结果对象,取个别名get_result, 方便后面用例调用
    • result.stdout 获取控制台输出结果
    • JSON.parse() JSON 解析
    • res_body.length 获取object 的长度
    • .to.be.at.least(1) 长度大于等于1
    • this.get_result 用this引用 beforeEach 里面的 get_result

    运行结果

  • 相关阅读:
    Custom.pll : ZOOM小测试
    在编写PL/SQL代码中使用SELECT语句时如何避免例外发生
    使用Custom.pll修改标准Form的LOV(转)
    WINCE 定时器0控制LED驱动源码
    WinCE文件目录定制
    printf输出格式
    WINCE 微秒、毫秒级延时函数
    WINCE远程注册表的使用
    CE开发中可能遇到的问题
    S3C2440 进行微秒级、毫秒级延时函数
  • 原文地址:https://www.cnblogs.com/yoyoketang/p/13069698.html
Copyright © 2020-2023  润新知