【问题标题】:Problem with mutation testing of expressjs app (Stryker mutator)expressjs 应用程序的突变测试问题(Stryker mutator)
【发布时间】:2021-11-13 03:49:07
【问题描述】:

我已经制作了一个基本上是 RESTAPI 的 express 应用程序,并且我已经用 mocha 为该应用程序编写了测试。现在我想对我的应用程序进行突变测试,但遇到了问题。我的应用程序通过 express 的 app.listen(8000) 命令侦听端口 8000,我的测试通过我设置的路由(例如 localhost:8000/test)测试应用程序。当我尝试使用 stryker 进行突变测试时,我遇到的问题是每个创建的突变体都试图在测试时同时访问端口 8000,并且由于“EADDRINUSE:地址已在使用 :::8000”导致突变体被杀死100% 突变分数。我已经尝试在 package.json 中将测试脚本从“mocha”编辑为“mocha --exit”,并在最后一次测试完成后关闭服务器。

我认为通过使用 express 制作一个简单的 API,然后编写使用路由的测试并尝试使用 stryker 对其进行突变测试,可以很容易地重现该错误。有没有解决这个问题的方法,欢迎任何帮助!

【问题讨论】:

  • 请提供足够的代码,以便其他人更好地理解或重现问题。

标签: javascript express testing mutation-testing


【解决方案1】:

在 Stryker 中还有一个选项可以将并发测试(并发)设置为 1,以使测试引擎一次只运行 1 个测试。这对于测试来说会很慢,但应该可以工作。

我正在使用 NestJS 作为我的带有 Express 的 API 应用程序的框架。从那里,我可以使用 NestJS 的测试模块在内部启动应用程序。你有类似的吗?

就我而言,我可以在 beforeAll() 方法中单独启动应用程序,然后运行测试。

beforeAll(async () => {
        const moduleFixture: TestingModule = await Test.createTestingModule({
            imports: [AppModule],
        }).compile();

        app = moduleFixture.createNestApplication();
        await app.init();
    });

    ...

    it('/bad (GET) address should be Not Found', async () => {
        const ResponseData$ = await request(app.getHttpServer()).get('/bad');

        expect(ResponseData$.body.statusCode).toBe(404);
        expect(ResponseData$.body.message).toBe('Cannot GET /bad');
    });

这是一个简单的测试,但 app.getHttpServer() 是在我的测试中启动内部调用的关键,不需要在端口上运行应用程序,因为测试模块已经支持这一点。

这让我可以通过并行执行来运行我的所有测试,还可以让 Stryker 并行运行。

【讨论】:

    猜你喜欢
    • 2020-02-02
    • 2021-10-26
    • 2021-09-02
    • 2015-08-13
    • 2019-01-25
    • 1970-01-01
    • 1970-01-01
    • 2013-07-01
    • 1970-01-01
    相关资源
    最近更新 更多