蛙人 / 博客 / 从JavaScript测试中访问SQL数据库

从JavaScript测试中访问SQL数据库

GUI测试中的常见任务是自动化将某些数据输入到表单中。要正确测试和验证此类方案,通常需要与测试数据库后端进行交互。

例如,让’s在我们的网站上拍摄评估表,假设我们’d喜欢为此进行测试。因此,只要访问者填写评估表单,所以输入的信息就会进入SQL数据库。

让我们假设数据库中的下表返回评估请求表单。

CREATE TABLE evaluation_requests (
  id CHAR(36),
  insertTime timestamp DEFAULT CURRENT_TIMESTAMP,
  name VARCHAR(255),
  email VARCHAR(255),
  company VARCHAR(255),
  countryCode CHAR(2),
  productId SMALLINT,
  PRIMARY KEY (id)
);
CREATE TABLE countries (
  id CHAR(2),
  name VARCHAR(255)
);
CREATE TABLE products (
  id SMALLINT,
  name VARCHAR(255)
);

让我们采取以下方案作为我们想要自动化的测试:

Feature: Creating Evaluation Requests

# ...

    Scenario: An entry is added to database
        Given the evaluation form is opened
        When I fill out the evaluation form
            | Max Mustermann | [email protected] | Sample Ltd. | Germany | Squish for Qt |
        And I submit the evaluation form
        Then the above informations should be in the database

# ...

因此,使用一些非特殊值填写并提交表单应触发添加到的新行 evaluation_requests. 桌子。作为验证这一点作为实施的一部分 上述信息应在数据库中 步骤,我们要查看MySQL数据库。

我们希望在数据库中显示的值取自场景。让他们在最后一步中可以访问,我们必须在上一步中保存它们;把它们放入上下文中 用户数据 space.

When("I fill out the evaluation form", function(context) {
    var data = context.table[0];
    context.userData.formValues = data;
    // ...
    // UI actions for filling out the form
}

在最后一步’S的实现,我们从建立与我们的SQL数据库的连接。

    var dbConnection = SQL.connect( { Driver: "MySQL",
        Host: "www-test",
        Port: 3306,
        Database: "evaldb-04",
        UserName: "evals",
        Password: "3vals" } );

SQL查询基于上表定义。在孤立的测试环境中运行的测试意味着我们可以安全地假设除了我们自己的测试是写入数据库的情况。因此,我们只能关心最近的进入(通过Inserttime DESC限制1)。

    var sql = "SELECT e.name, email, company, c.name as country, p.name as product \
               FROM evaluation_requests e \
               LEFT JOIN countries c \
                 ON e.countryCode = c.id \
               LEFT JOIN products p \
                 ON e.productId = p.id \
               ORDER BY insertTime DESC \
               LIMIT 1";

询问() 方法执行SQL语句,并提供指向第一行的结果集。

    var result = dbConnection.query(sql);

如果是空结果集,则 结果。已验证 属性设置为false。我们可以使用使用的当前行的值 价值() 功能。可以使用数字索引以及使用更可读的列名称。

    if (!result.isValid) {
        test.fail("Entry not found.");
    } else {
        test.compare(result.value("name"), context.userData.formValues[0]);
        test.compare(result.value("email"), context.userData.formValues[1]);
        test.compare(result.value("company"), context.userData.formValues[2]);
        test.compare(result.value("country"), context.userData.formValues[3]);
        test.compare(result.value("product"), context.userData.formValues[4]);
    }

最后,我们通过关闭连接完成数据库访问。

    dbConnection.close();

所以我们最终结束了:

    var dbConnection = SQL.connect({
        Driver: "MySQL",
        Host: "www-test",
        Port: 3306,
        Database: "evaldb-04",
        UserName: "evals",
        Password: "3vals" });
    var sql = "SELECT e.name, email, company, c.name as country, p.name as product \
               FROM evaluation_requests e \
               LEFT JOIN countries c \
                 ON e.countryCode = c.id \
               LEFT JOIN products p \
                 ON e.productId = p.id \
               ORDER BY insertTime DESC \
               LIMIT 1";
    var result = dbConnection.query(sql);
    if (!result.isValid) {
        test.fail("Entry not found.");
    } else {
        test.compare(result.value("name"), context.userData.formValues[0]);
        test.compare(result.value("email"), context.userData.formValues[1]);
        test.compare(result.value("company"), context.userData.formValues[2]);
        test.compare(result.value("country"), context.userData.formValues[3]);
        test.compare(result.value("product"), context.userData.formValues[4]);
    }
    dbConnection.close();

如果您关心多个行, 结果。TONEXT() 向下移动到下一行。使这与结果相结合.Isvalid允许您轻松遍历结果集:

result = connection.query(sql);
while (result.isValid) {
    doSomethingWith(row);
    result.next();
}

发表评论

您的电子邮件地址不会被公开。 必需的地方已做标记 *

复制链接