Jest 测试多个测试文件端口 3000 已被使用
Jest testing multiple test file port 3000 already in use
我正在为我的 Express 应用创建测试。该项目有多个测试文件。在每个模块中,服务器实例在 beforeEach() 方法中是必需的,并在 afterEach() 方法中关闭。但是在测试了一个或两个模块之后,它会引发已经在使用的地址并且玩笑不会终止。
beforeEach(() => {
server = require('./../../../bin/www')});
afterEach(async() => {
server.close();
/**
* database cleanup logic goes here.
*/
});
我希望 jest 在所有测试套件完成后终止。
我遇到了这个问题,似乎通过将 jest 设置为仅使用一名工人来解决它。我认为问题是由多个服务器 运行 同一端口实例引起的,从而导致冲突。
这是我的 npm package.json 文件中的行。 --maxWorkers=1
似乎成功了 (https://jestjs.io/docs/en/cli#maxworkers-num-string)。
"scripts": {
"test": "jest --forceExit --detectOpenHandles --watchAll --maxWorkers=1"
},
还有一个选项--运行InBand to 运行 一个一个测试。
我正在使用 Node Express 服务器 4.16.2。如果您使用的是其他版本,这可能不适用于您。
在您关闭服务器时的描述块中,await
。
describe('auth midleware', () => {
// loading the server
beforeEach(() => {>
server = require('../../../index')
});
// closing the server
afterEach(async () => {
await server.close();
});
// the tests will go here
});
此外,在您执行此操作后,运行 您在命令行中的节点应用程序。
node index.js
检查您的 package.json,您的脚本测试标签是如何命名的。我的是测试。
{ ...
"scripts": {
"test": "jest --verbose --coverage --forceExit --watchAll --maxWorkers=1"
}
...
}
之后 运行 再次测试。
npm test
我遇到了同样的问题,事实证明最后一个测试用例在移动到下一个测试套件之前不允许 jest 正确关闭,所以我添加了
it('should blah blah', asyn(done) => {
test code...
done()
})
最基本的做法是将 app.listen() 放入其他文件中,而不是包含所有路由的文件中。
例如 :
index.js
const express = require("express");
const app = express();
const bodyParser = require("body-parser");
app.use(bodyParser.json());
const students = ["Elie", "Matt", "Joel", "Michael"];
app.get("/", (req, res) => {
return res.json(students);
});
module.exports = app;
和server.js
const app = require("./index");
app.listen(3000, () => console.log("server starting on port 3000!"));
这样 Jest 就不会读取 app.listen() 了。干杯!
默认情况下只有 运行s 个并行测试套件。但是,进行测试的机器 运行 只有一个端口 3000(或端口 4000 等)
这意味着如果您告诉您的应用程序监听一个端口,然后启动多个并发进程,将会发生端口冲突并且 Jest 将退出 EADDRINUSE - port already in use
。
就像一些人已经提到的那样,您可以通过 运行按 --runInBand
顺序进行测试来解决问题。但是,您将失去并行化的性能优势。
还有另一种方法...在 运行ning 测试时不要显式监听端口。
if (process.env.NODE_ENV !== 'test') {
app.listen(port, () => console.log(`Listening on port ${port}`)
}
现在,当您将您的应用程序提供给超级测试时,它会运行您的应用程序在端口 0 上,因为它还没有 运行在端口上.
const app = require('../app')
const request = require('supertest')
it('gets todos', async () => {
const response = await request(app).get('/todos')
expect(response.body.length).toEqual(3)
}
你问端口0到底是什么?这就是你告诉 Unix 机器的方式...
Choose the first randomly available port that you find.
现在每个测试套件 运行 都在一个随机可用的端口上,不再存在端口冲突的风险,这意味着我们已经解决了 EADDRINUSE - port already in use
错误,我们可以继续 运行并行测试。
server = require('./../../../bin/www')});
afterEach(async() => {
await server.close();
您刚刚等待正确关闭服务器。
我正在为我的 Express 应用创建测试。该项目有多个测试文件。在每个模块中,服务器实例在 beforeEach() 方法中是必需的,并在 afterEach() 方法中关闭。但是在测试了一个或两个模块之后,它会引发已经在使用的地址并且玩笑不会终止。
beforeEach(() => {
server = require('./../../../bin/www')});
afterEach(async() => {
server.close();
/**
* database cleanup logic goes here.
*/
});
我希望 jest 在所有测试套件完成后终止。
我遇到了这个问题,似乎通过将 jest 设置为仅使用一名工人来解决它。我认为问题是由多个服务器 运行 同一端口实例引起的,从而导致冲突。
这是我的 npm package.json 文件中的行。 --maxWorkers=1
似乎成功了 (https://jestjs.io/docs/en/cli#maxworkers-num-string)。
"scripts": {
"test": "jest --forceExit --detectOpenHandles --watchAll --maxWorkers=1"
},
还有一个选项--运行InBand to 运行 一个一个测试。
我正在使用 Node Express 服务器 4.16.2。如果您使用的是其他版本,这可能不适用于您。
在您关闭服务器时的描述块中,await
。
describe('auth midleware', () => {
// loading the server
beforeEach(() => {>
server = require('../../../index')
});
// closing the server
afterEach(async () => {
await server.close();
});
// the tests will go here
});
此外,在您执行此操作后,运行 您在命令行中的节点应用程序。
node index.js
检查您的 package.json,您的脚本测试标签是如何命名的。我的是测试。
{ ...
"scripts": {
"test": "jest --verbose --coverage --forceExit --watchAll --maxWorkers=1"
}
...
}
之后 运行 再次测试。
npm test
我遇到了同样的问题,事实证明最后一个测试用例在移动到下一个测试套件之前不允许 jest 正确关闭,所以我添加了
it('should blah blah', asyn(done) => {
test code...
done()
})
最基本的做法是将 app.listen() 放入其他文件中,而不是包含所有路由的文件中。 例如 : index.js
const express = require("express");
const app = express();
const bodyParser = require("body-parser");
app.use(bodyParser.json());
const students = ["Elie", "Matt", "Joel", "Michael"];
app.get("/", (req, res) => {
return res.json(students);
});
module.exports = app;
和server.js
const app = require("./index");
app.listen(3000, () => console.log("server starting on port 3000!"));
这样 Jest 就不会读取 app.listen() 了。干杯!
默认情况下只有 运行s 个并行测试套件。但是,进行测试的机器 运行 只有一个端口 3000(或端口 4000 等)
这意味着如果您告诉您的应用程序监听一个端口,然后启动多个并发进程,将会发生端口冲突并且 Jest 将退出 EADDRINUSE - port already in use
。
就像一些人已经提到的那样,您可以通过 运行按 --runInBand
顺序进行测试来解决问题。但是,您将失去并行化的性能优势。
还有另一种方法...在 运行ning 测试时不要显式监听端口。
if (process.env.NODE_ENV !== 'test') {
app.listen(port, () => console.log(`Listening on port ${port}`)
}
现在,当您将您的应用程序提供给超级测试时,它会运行您的应用程序在端口 0 上,因为它还没有 运行在端口上.
const app = require('../app')
const request = require('supertest')
it('gets todos', async () => {
const response = await request(app).get('/todos')
expect(response.body.length).toEqual(3)
}
你问端口0到底是什么?这就是你告诉 Unix 机器的方式...
Choose the first randomly available port that you find.
现在每个测试套件 运行 都在一个随机可用的端口上,不再存在端口冲突的风险,这意味着我们已经解决了 EADDRINUSE - port already in use
错误,我们可以继续 运行并行测试。
server = require('./../../../bin/www')});
afterEach(async() => {
await server.close();
您刚刚等待正确关闭服务器。