backend api api testing QA Automate

快速生成API測試案例 - Keploy

張庭瑋 Gary Chang 2024/03/07 10:00:00
454

環境說明:

 

Keploy官方文件的範例是使用Docker做測試環境

本文為方便示範,使用Windows + wsl + 本機MongoDB*

如何設定可以參考這篇

 

 

前言:

說到測試api,一定會很快地想到swagger 和 Postman

這兩項工具確實是開發中測試api的好幫手,但隨著要測的api越來越多,人工調整難免會出錯

Keploy可以(半)**自動產生測試案例,快速且穩定地替你把關

How it works

運作機制為:"紀錄每次呼叫API時的request / respond"產生測試案例,使用這個【真實情境】進行測試

 

使用範例:

比起文字說明,展示實際使用的效果應該可以比較好理解

使用keploy 提供的python範例

操作流程為 建立學生資料 > 修改 > 刪除

@app.route('/students', methods=['GET'])
def get_students():
    students = list(students_collection.find({}, {'_id': 0}))
    return jsonify(students)

@app.route('/students/<student_id>', methods=['GET'])
def get_student(student_id):
    student = students_collection.find_one({'student_id': student_id}, {'_id': 0})
    return jsonify(student)

@app.route('/students', methods=['POST'])
def create_student():
    new_student = request.json
    students_collection.insert_one(new_student)
    return jsonify({'message': 'Student created successfully'})

@app.route('/students/<student_id>', methods=['PUT'])
def update_student(student_id):
    updated_student = request.json
    students_collection.update_one({'student_id': student_id}, {'$set': updated_student})
    return jsonify({'message': 'Student updated successfully'})

@app.route('/students/<student_id>', methods=['DELETE'])
def delete_student(student_id):
    students_collection.delete_one({'student_id': student_id})
    return jsonify({'message': 'Student deleted successfully'})

 

呼叫的指令為如下 (也可以用Postman或是其他習慣使用的工具,沒有侷限)

curl -X POST -H "Content-Type: application/json" -d '{"student_id": "12345", "name": "John Doe", "age": 20}' http://localhost:6000/students

curl http://localhost:6000/students

curl -X PUT -H "Content-Type: application/json" -d '{"name": "Jane Smith", "age": 21}' http://localhost:6000/students/12345

curl http://localhost:6000/students/12345

curl -X DELETE http://localhost:6000/students/12345

 

Keploy 實際運作畫面

 

通過的情境:

錄製完成之後,執行測試

每次開啟Keploy就會新建一個資料夾

該次錄製的案例名稱就是test - 1, 2, 3....

 

失敗的情境:

這時候我們將DELETE修改為

@app.route('/students/<student_id>', methods=['DELETE'])
def delete_student(student_id):
    
    return jsonify({'message': 'Deletion simulated, but not executed.'})

使用原本的test-set-0進行測試