续集测试 - 有时验证错误

Posted

技术标签:

【中文标题】续集测试 - 有时验证错误【英文标题】:Sequelize Tests - Sometimes Validation Error 【发布时间】:2015-12-10 00:56:54 【问题描述】:

我正在通过 Mocha / Chai 在 sequelize 定义上运行单元测试,如图所示:

使用mocha tests.js 运行的主要tests.js:

// Testing Dependencies
expect = require("chai").expect;
should = require("chai").should;
require('dotenv').load();

var Sequelize = require('sequelize');
var sequelize = new Sequelize(
    process.env.PG_DB_TEST,
    process.env.PG_USER,
    process.env.PG_PASSWORD, 
    dialect: "postgres",
    logging: false
);

var models = require('./models/db')(sequelize);

var seq_test = function (next) 
  return function () 
    beforeEach(function (done) 
        sequelize.sync( force: true ).then(function() 
            done();
        );
    );

    afterEach(function (done) 
        sequelize.drop().then(function() 
            done();
        );
    );

    next();
  ;


describe("Model Unittests", seq_test(function () 
  require("./models/tests/test_user.js")(models);
  require("./models/tests/test_interest.js")(models);
));

test_user.js

var mockedUser = require("./mocks/user");

module.exports = function (models) 
  var User = models.user;
  it("User should have the correct fields", function (done) 
    User.create(mockedUser).then(function (result) 
      expect(result.pack()).to.include.all.keys(
            ["id", "name", "email", "intro"]
      );
      done();
    );
  );

  it("User should require an email", function (done) 
    User.create(
      "name": mockedUser['name']
    ).then(function (result) 
      expect.fail();
      done();
    ).catch(function (err) 
      expect(err['name']).to.be.equal('SequelizeValidationError');
      done();
    );
  );

  it("User should require a name", function (done) 
    User.create(
      "email": mockedUser['email']
    ).then(function (result) 
      expect.fail();
      done();
    ).catch(function (err) 
      expect(err['name']).to.be.equal('SequelizeValidationError');
      done();
    );
  );

有时(在 Codeship (CI) 上大约有 15 人中有 1 人)会出现此错误:

  Model Unittests
Unhandled rejection SequelizeUniqueConstraintError: Validation error
at Query.formatError (/home/rof/src/github.com/podtogether/pod-test-prototype/node_modules/sequelize/lib/dialects/postgres/query.js:402:16)
at null.<anonymous> (/home/rof/src/github.com/podtogether/pod-test-prototype/node_modules/sequelize/lib/dialects/postgres/query.js:108:19)
at emitOne (events.js:77:13)
at emit (events.js:169:7)
at Query.handleError (/home/rof/src/github.com/podtogether/pod-test-prototype/node_modules/pg/lib/query.js:108:8)
at null.<anonymous> (/home/rof/src/github.com/podtogether/pod-test-prototype/node_modules/pg/lib/client.js:171:26)
at emitOne (events.js:77:13)
at emit (events.js:169:7)
at Socket.<anonymous> (/home/rof/src/github.com/podtogether/pod-test-prototype/node_modules/pg/lib/connection.js:109:12)
at emitOne (events.js:77:13)
at Socket.emit (events.js:169:7)
at readableAddChunk (_stream_readable.js:146:16)
at Socket.Readable.push (_stream_readable.js:110:10)
at TCP.onread (net.js:523:20)
  1) "before each" hook for "User should have the correct fields"

在本地,这些单元测试并没有失败(我可能已经运行了它......连续 60 次)。我之前在beforeEachafterEach 中没有使用done 回调时也看到了类似的问题。这两个都是异步的,需要等待才能继续。修复该问题后,我在本地不再看到这些问题。

谁能解释一下这个问题? (ssh 到 Codeship 并运行测试导致 1 / ~15 错误)

【问题讨论】:

你有没有想过这个问题?我们的单元测试可能有不少于 20% 的时间因为这个原因而失败。 不,很遗憾我没有。我猜它是某种尚未正确处理的异步行为?不知道为什么它可以完美地在我的本地机器上运行。 没关系。我发现了我们的问题。我们正在为我们的单元测试生成随机电话号码。测试后它们没有被删除,因此错误是主键约束错误。不管怎么说,多谢拉!我希望你能解决你的问题。 【参考方案1】:

我的 QA 数据库遇到了这个问题。有时一条新记录会保存到数据库中,有时它会失败。在我的开发工作站上执行相同的过程时,每次都会成功。

当我发现错误并将完整结果打印到控制台时,它确认违反了唯一约束 - 特别是主键 id 列,该列默认设置为自动递增值。

我已经在我的数据库中植入了记录,尽管这些记录的 id 也设置为自动增量,但 200 条记录的 id 分散在 1 到 2000 之间,但数据库的自动增量序列设置为从1. 通常顺序的下一个id没有被使用,但偶尔已经被占用了,数据库会返回这个错误。

我使用答案here 将序列重置为在我的最后一条种子记录之后开始,现在它每次都有效。

如果您正在播种记录以在其上运行集成测试,则数据库自动增量序列可能未设置为遵循它们。 Sequelize 没有此功能,因为它是一个简单的单命令操作,需要在数据库中运行。

【讨论】:

【参考方案2】:

我遇到了这个问题。这是由于播种后未正确设置自动增量造成的。根本问题是我们的种子方法在种子方法中明确设置了主/自动增量键(id),通常应该避免这种情况。我们删除了 ID,问题得到了解决。

这是我们找到解决方案的续集问题的参考:https://github.com/sequelize/sequelize/issues/9295#issuecomment-382570944

【讨论】:

以上是关于续集测试 - 有时验证错误的主要内容,如果未能解决你的问题,请参考以下文章

续集你正在使用sql安全更新错误

接口测试&管理续集

Renix软件如何发送CRC错误的报文——网络测试仪实操

验证&system verilog笔试题

Centos 6安装 Jenkins

前端后端的爱恨情仇--续集