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

運行結果


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM