前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Cypress web自动化36-cy.exec()执行python查询数据库获取结果

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

作者头像
上海-悠悠
发布2020-06-10 10:53:54
1.3K0
发布2020-06-10 10:53:54
举报
文章被收录于专栏:从零开始学自动化测试

前言

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

解决思路

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

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

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

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

代码语言:javascript
复制
# json
[{"name": "test", "sex": "F", "mail": "283340479@qq.com"}]

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

代码语言:javascript
复制
# js object
[{name: "test", sex: "F", mail: "283340479@qq.com"}]

查询数据库

代码语言:javascript
复制
# 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 对象,并传给用例

代码语言:javascript
复制
/**
 * 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() {
        // json 解析
        cy.visit('https://www.cnblogs.com/yoyoketang')
        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

运行结果

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 从零开始学自动化测试 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 解决思路
  • 查询数据库
  • json解析
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档