我应该如何利用Neo4j数据库对nodeJs API进行自动化测试

时间:2018-10-04 13:22:37

标签: node.js neo4j automated-tests

我目前正在研究几个确实利用Neo4J数据库的NodeJS API。我想在每个端点上进行自动化测试,并确保一切正常(例如:POST用户应在我的图形中使用期望的标签和属性创建节点用户)

作为一个初级开发人员,我不太确定从哪里开始。

我最初的想法是建立一个灯具Neo4j数据库(通过对将生成灯具数据的空图执行长密码查询) 问题是该灯具数据库将受到我所做的不同测试的影响。 对于实例,如果我要测试DELETE端点,则将断言将从数据库中删除数据。

我看到了两种解决方案:

  • 在测试端点之前,我会生成一些所需的数据。但是后来我 测试后必须确保将其删除以免损害 固定装置,并影响其他端点测试。

  • 在测试端点之前,我先清理数据库,执行夹具查询,然后执行第二个查询以添加一些额外数据来测试端点。然后,对于每个端点,请确保拥有一个干净的数据库,并最终包含一些额外的数据。

第一个解决方案似乎很费力/费时,而第二个解决方案似乎有点粗糙。也许我对自动化测试的想法是错误的。

这里是我做过的测试的一个示例(使用mochajs和chai),其中我更改了组织的管理员:

    describe('UPDATE organisation', () => {
    before((doneBefore) => {
      const admin1 = updateOrganisationUtilities.createAdmin('admin@test.com');
      const admin2 = updateOrganisationUtilities.createAdmin('admin2@test.com');
      Promise.all([admin1, admin2]).then(
        (admins) => {
          idAdmin = admins[0].id;
          idAdmin2 = admins[1].id;
          updateOrganisationUtilities.bindAdminToOrganisation(idAdmin, idOrganisation)
            .then(() => {
              doneBefore();
            });
        });
    });
    after((doneAfter) => {
      Promise.all([
        updateOrganisationUtilities.deleteExtraData(),
      ]).then(() => {
        doneAfter();
      });
    });
    it('Should update an organisation', (doneIt) => {
      const req = {
        method: 'PUT',
        url: `/organisations/${idOrganisation}`,
        payload: JSON.stringify({
          name: 'organisation-test',
          address: 'here',
          trainingNumber: '15',
          type: 'organisation.types.university',
          expirationDate: new Date(),
          idAdmin: idAdmin2,
        }),
        headers: {
          authorization: token,
        },
      };
      server.inject(req, (res) => {
        assert.equal(res.statusCode, 200);
        assert.exists(res.result.id);
        assert.equal(res.result.address, 'here');
        assert.equal(res.result.trainingNumber, '15');
        assert.equal(res.result.type, 'organisation.types.university');
        updateOrganisationUtilities.getLinkBetweenAdminAndOrga(res.result.id, idAdmin2)
          .then((link) => {
            assert.include(link, 'IS_ADMIN');
            assert.include(link, 'ROLE');
            doneIt();
          });
      });
    });
  });

如您所见:

  • 我在before()中创建了一些有用的额外数据
  • 我删除after()中的多余数据
  • 方法updateOrganisationUtilities.getLinkBetweenAdminAndOrga() 检查Neo4j中的更改是否已正确应用。

这似乎可行,但我担心当我要进行数百次可能改变数据库的测试时,要维持这种结构将成为PITA。此外,我担心用这种方式测试端点会浪费太多时间,因为我必须在每次端点测试之前和之后编写特定的功能/查询。

很抱歉,我的问题似乎尚未解决,但我对有经验的开发人员如何处理端点自动测试感到非常好奇。

1 个答案:

答案 0 :(得分:1)

为确保一项测试的意外更改不会影响另一项测试,应在每次测试后完全清空数据库,并在每次测试之前创建适当的夹具。这样不仅可以确保您正在使用期望的数据进行测试,还可以使测试的实施更加容易。