前言
cy.exec() 可以執行系統指令行,那麼用 python 寫個查詢 sql 的時候,傳回結果是 json 格式。
cypress 的腳本是 javascript 語言寫的,沒法直接識别python傳回的資料,需用 JSON 解析成 object 對象。
解決思路
遇到場景:
寫自動化用例的時候,需要準備測試資料,有些資料是需要動态從資料庫中讀取,是以會先查詢資料庫,得到查詢結果。
然後把測試結果用到自動化用例裡面關聯起來。
用 python 查詢資料庫傳回的是 list of dict 類型的資料,這隻是python裡面的資料類型.
# 注意 這裡是單引号,并不是标準的json類型
[{'name': 'test', 'sex': 'F', 'mail': '[email protected]'}]
是以需轉成json格式輸出到控制台,如下格式
# json
[{"name": "test", "sex": "F", "mail": "[email protected]"}]
cy.exec() 執行指令行後擷取到的是字元串類型,字元串類型取值的話不太好取值,最好是先轉object對象
# js object
[{name: "test", sex: "F", mail: "[email protected]"}]
查詢資料庫
# 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": "[email protected]"}]
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