当前位置: 首页 > 测试知识 > 使用Postman实现数据库校验测试:使用pm.sendRequest进行端到端数据验证
使用Postman实现数据库校验测试:使用pm.sendRequest进行端到端数据验证
2025-11-20 作者cwb 浏览次数3

Postman实现数据库校验:使用pm.sendRequest进行端到端数据验证.在API测试中,仅验证HTTP响应并不够充分。真正的API测试需要验证API操作是否正确地影响了底层数据。


数据库校验的作用

为什么需要数据库校验?

数据一致性验证:保证API操作正确持久化到数据库

业务逻辑完整性:验证复杂业务规则在数据层的正确实现

隐藏业务规则检测:发现未在API响应中暴露的数据变更

数据关系完整性:验证外键关系、数据依赖等复杂约束


校验的问题

数据库连接隔离:解决方案通过专用的数据库查询API网关

查询语句构建:解决方案使用预定义查询模板+动态参数替换

结果集解析:解决方案JavaScript脚本处理JSON响应

测试数据污染:解决方案自动化测试数据生命周期管理

构建数据库查询网关

1. 数据库查询API设计

创建专用的数据库查询端点,避免直接暴露数据库连接:


javascript

// 数据库查询API示例结构

const dbQueryAPI = {

  // 简单查询端点

  "single_record": {

    "method": "POST",

    "url": "{{db_gateway_base}}/query/single",

    "body": {

      "query_template": "SELECT * FROM {{table}} WHERE {{condition}}",

      "parameters": {

        "table": "users",

        "condition": "id = {{user_id}}"

      }

    }

  },

  

  // 复杂查询端点

  "complex_query": {

    "method": "POST", 

    "url": "{{db_gateway_base}}/query/complex",

    "body": {

      "query_name": "user_orders_summary",

      "parameters": {

        "user_id": "{{customer_id}}",

        "start_date": "{{$timestamp}}"

      }

    }

  }

};


2. 环境配置


javascript

// 环境变量配置

pm.environment.set("db_gateway_base", "https://db-gateway.example.com");

pm.environment.set("db_gateway_api_key", "your-secure-api-key");


// 全局变量 - 查询模板

pm.globals.set("query_templates", {

  "user_by_id": "SELECT id, username, email, created_at FROM users WHERE id = {{user_id}}",

  "order_by_id": "SELECT o.*, u.username FROM orders o JOIN users u ON o.user_id = u.id WHERE o.id = {{order_id}}",

  "recent_orders": "SELECT * FROM orders WHERE user_id = {{user_id}} AND created_at > '{{cutoff_date}}'"

});


实现数据库校验的模式


1. 基础数据校验


javascript

// 在Tests标签中实现数据库校验

pm.test("API响应和数据库数据一致性验证", function() {

    const apiResponse = pm.response.json();

    const userId = apiResponse.user.id;

    

    // 构建数据库查询请求

    const dbQueryRequest = {

        url: pm.environment.get("db_gateway_base") + "/query/single",

        method: "POST",

        header: {

            'Content-Type': 'application/json',

            'Authorization': 'Bearer ' + pm.environment.get("db_gateway_api_key")

        },

        body: {

            mode: 'raw',

            raw: JSON.stringify({

                query_template: pm.globals.get("query_templates").user_by_id,

                parameters: {

                    user_id: userId

                }

            })

        }

    };

    

    // 发送同步数据库查询请求

    pm.sendRequest(dbQueryRequest, function(err, response) {

        if (err) {

            pm.expect.fail("数据库查询失败: " + err.message);

            return;

        }

        

        const dbData = response.json();

        

        // 数据一致性断言

        pm.expect(dbData.record.id).to.equal(apiResponse.user.id);

        pm.expect(dbData.record.email).to.equal(apiResponse.user.email);

        pm.expect(dbData.record.username).to.equal(apiResponse.user.username);

        

        // 时间戳验证 (允许微小差异)

        const apiTimestamp = new Date(apiResponse.user.updated_at).getTime();

        const dbTimestamp = new Date(dbData.record.updated_at).getTime();

        pm.expect(Math.abs(apiTimestamp - dbTimestamp)).to.be.lessThan(1000);

    });

});


2. 复杂业务逻辑验证


javascript

// 验证订单创建的业务逻辑

pm.test("订单创建业务规则验证", function() {

    const orderResponse = pm.response.json();

    const orderId = orderResponse.order.id;

    const userId = orderResponse.order.user_id;

    

    // 并行查询多个数据源

    const orderQuery = buildDBRequest("order_by_id", { order_id: orderId });

    const userQuery = buildDBRequest("user_by_id", { user_id: userId });

    

    Promise.all([

        sendDBQuery(orderQuery),

        sendDBQuery(userQuery)

    ]).then(([orderResult, userResult]) => {

        const orderData = orderResult.json();

        const userData = userResult.json();

        

        // 业务规则验证

        pm.expect(orderData.record.status).to.equal('pending');

        pm.expect(orderData.record.total_amount).to.equal(orderResponse.order.total);

        pm.expect(userData.record.id).to.equal(userId);

        

        // 跨表关系验证

        pm.expect(orderData.record.username).to.equal(userData.record.username);

        

    }).catch(error => {

        pm.expect.fail("业务规则验证失败: " + error.message);

    });

});


// 封装数据库查询函数

function buildDBRequest(queryName, parameters) {

    return {

        url: pm.environment.get("db_gateway_base") + "/query/single",

        method: "POST",

        header: {

            'Content-Type': 'application/json',

            'Authorization': 'Bearer ' + pm.environment.get("db_gateway_api_key")

        },

        body: {

            mode: 'raw',

            raw: JSON.stringify({

                query_template: pm.globals.get("query_templates")[queryName],

                parameters: parameters

            })

        }

    };

}


function sendDBQuery(request) {

    return new Promise((resolve, reject) => {

        pm.sendRequest(request, (err, response) => {

            if (err) reject(err);

            else resolve(response);

        });

    });

}


高级数据校验

1. 数据状态机验证


javascript

// 验证订单状态流转

pm.test("订单状态机一致性验证", function() {

    const orderId = pm.environment.get("current_order_id");

    

    // 查询订单当前状态

    const statusQuery = buildDBRequest("order_by_id", { order_id: orderId });

    

    pm.sendRequest(statusQuery, function(err, response) {

        const dbOrder = response.json().record;

        const expectedStatus = pm.environment.get("expected_order_status");

        

        // 状态机规则验证

        const validTransitions = {

            'pending': ['processing', 'cancelled'],

            'processing': ['shipped', 'cancelled'],

            'shipped': ['delivered'],

            'cancelled': [],

            'delivered': []

        };

        

        const currentStatus = dbOrder.status;

        const isValidTransition = validTransitions[expectedStatus.previous]?.includes(currentStatus);

        

        pm.expect(isValidTransition, `无效状态流转: ${expectedStatus.previous} -> ${currentStatus}`).to.be.true;

        pm.expect(dbOrder.status_updated_at).to.be.greaterThan(expectedStatus.timestamp);

    });

});


2. 数据完整性验证


javascript

// 验证数据完整性和约束

pm.test("数据完整性约束验证", function() {

    const newUser = pm.response.json();

    

    const integrityChecks = [

        buildDBRequest("check_email_unique", { email: newUser.email }),

        buildDBRequest("check_username_unique", { username: newUser.username }),

        buildDBRequest("verify_user_profile", { user_id: newUser.id })

    ];

    

    // 执行所有完整性检查

    Promise.all(integrityChecks.map(sendDBQuery))

        .then(responses => {

            responses.forEach((response, index) => {

                const checkResult = response.json();

                

                switch(index) {

                    case 0: // 邮箱唯一性

                        pm.expect(checkResult.is_unique, "邮箱地址必须唯一").to.be.true;

                        break;

                    case 1: // 用户名唯一性  

                        pm.expect(checkResult.is_unique, "用户名必须唯一").to.be.true;

                        break;

                    case 2: // 用户档案完整性

                        pm.expect(checkResult.has_complete_profile, "用户档案不完整").to.be.true;

                        break;

                }

            });

        })

        .catch(error => {

            pm.expect.fail("数据完整性检查失败: " + error.message);

        });

});


测试数据管理

1. 测试数据准备和清理


javascript

// Pre-request Script: 准备测试数据

const testUser = {

    email: `test${Date.now()}@example.com`,

    username: `testuser${Date.now()}`,

    password: "Test123!"

};


pm.environment.set("test_user_data", JSON.stringify(testUser));


// 创建测试用户

const createUserRequest = {

    url: pm.environment.get("api_base") + "/users",

    method: "POST",

    header: {'Content-Type': 'application/json'},

    body: {mode: 'raw', raw: JSON.stringify(testUser)}

};


pm.sendRequest(createUserRequest, function(err, response) {

    if (response.code === 201) {

        const userData = response.json();

        pm.environment.set("test_user_id", userData.id);

    }

});


// Tests Script: 业务测试后清理数据

if (pm.response.code === 200 || pm.response.code === 201) {

    const cleanupQuery = {

        url: pm.environment.get("db_gateway_base") + "/cleanup/test-data",

        method: "POST",

        header: {

            'Authorization': 'Bearer ' + pm.environment.get("db_gateway_api_key")

        },

        body: {

            mode: 'raw',

            raw: JSON.stringify({

                user_id: pm.environment.get("test_user_id")

            })

        }

    };

    

    // 异步清理,不阻塞测试执行

    pm.sendRequest(cleanupQuery);

}


2. 数据版本控制


javascript

// 验证数据版本一致性

pm.test("数据版本控制验证", function() {

    const apiData = pm.response.json();

    const expectedVersion = pm.environment.get("expected_data_version");

    

    const versionQuery = buildDBRequest("get_data_version", { 

        record_id: apiData.id,

        table_name: apiData.type 

    });

    

    pm.sendRequest(versionQuery, function(err, response) {

        const dbVersion = response.json().version;

        

        // 乐观锁验证

        pm.expect(dbVersion).to.equal(expectedVersion);

        

        // 更新时间验证

        const dbUpdatedAt = new Date(response.json().updated_at);

        const apiUpdatedAt = new Date(apiData.updated_at);

        pm.expect(dbUpdatedAt.getTime()).to.equal(apiUpdatedAt.getTime());

    });

});


性能和可靠性优化

1. 查询超时和重试机制


javascript

// 带重试的数据库查询

function sendDBQueryWithRetry(request, maxRetries = 3) {

    return new Promise((resolve, reject) => {

        let attempts = 0;

        

        function executeQuery() {

            pm.sendRequest(request, (err, response) => {

                if (err && attempts < maxRetries) {

                    attempts++;

                    // 指数退避重试

                    setTimeout(executeQuery, Math.pow(2, attempts) * 1000);

                } else if (err) {

                    reject(err);

                } else {

                    resolve(response);

                }

            });

        }

        

        executeQuery();

    });

}


// 设置查询超时

pm.sendRequest({

    url: pm.environment.get("db_gateway_base") + "/query/single",

    method: "POST",

    timeout: 10000, // 10秒超时

    // ... 其他参数

});


2. 批量数据验证


javascript

// 批量数据一致性验证

pm.test("批量操作数据一致性", function() {

    const batchResponse = pm.response.json();

    const createdIds = batchResponse.created_ids;

    

    const verificationPromises = createdIds.map(id => {

        const query = buildDBRequest("verify_record_exists", { record_id: id });

        return sendDBQueryWithRetry(query);

    });

    

    Promise.all(verificationPromises)

        .then(responses => {

            responses.forEach((response, index) => {

                const exists = response.json().exists;

                pm.expect(exists, `记录 ${createdIds[index]} 未正确创建`).to.be.true;

            });

            

            // 验证总数一致性

            const countQuery = buildDBRequest("count_records", { 

                condition: `id IN (${createdIds.join(',')})` 

            });

            

            return sendDBQuery(countQuery);

        })

        .then(countResponse => {

            const dbCount = countResponse.json().count;

            pm.expect(dbCount).to.equal(createdIds.length);

        })

        .catch(error => {

            pm.expect.fail("批量数据验证失败: " + error.message);

        });

});


完整的端到端测试例子


javascript

// 完整的用户注册流程测试

describe("用户注册端到端测试", function() {

    let testUserData;

    

    before(function() {

        // 准备测试数据

        testUserData = {

            email: `test.${Date.now()}@example.com`,

            username: `integration_test_${Date.now()}`,

            password: "SecurePass123!"

        };

        pm.environment.set("test_user", JSON.stringify(testUserData));

    });

    

    it("应该成功创建用户账户", function() {

        const response = pm.response.json();

        pm.expect(response.success).to.be.true;

        pm.environment.set("new_user_id", response.user.id);

    });

    

    it("应该在数据库中创建用户记录", function(done) {

        const userId = pm.environment.get("new_user_id");

        

        sendDBQuery(buildDBRequest("user_by_id", { user_id: userId }))

            .then(dbResponse => {

                const dbUser = dbResponse.json().record;

                pm.expect(dbUser).to.not.be.null;

                pm.expect(dbUser.email).to.equal(testUserData.email);

                pm.expect(dbUser.username).to.equal(testUserData.username);

                done();

            })

            .catch(done);

    });

    

    it("应该建立正确的用户权限", function(done) {

        const userId = pm.environment.get("new_user_id");

        

        const permissionQuery = buildDBRequest("user_permissions", { user_id: userId });

        sendDBQuery(permissionQuery)

            .then(response => {

                const permissions = response.json().permissions;

                pm.expect(permissions).to.include('user:read');

                pm.expect(permissions).to.include('user:write:self');

                done();

            })

            .catch(done);

    });

    

    after(function() {

        // 测试数据清理

        const cleanupRequest = {

            url: pm.environment.get("db_gateway_base") + "/cleanup",

            method: "POST",

            body: {

                mode: 'raw',

                raw: JSON.stringify({

                    user_id: pm.environment.get("new_user_id")

                })

            }

        };

        pm.sendRequest(cleanupRequest);

    });

});


通过这种系统化的方法,可以在Postman中构建强大的数据库校验能力,保证API操作在数据层的正确,实现真正的端到端测试覆盖。


文章标签: 数据库测试 数据库系统检测 软件数据库测试 测试工具 软件测试
咨询软件测试