带有身份验证的服务器,使用 mocha 进行测试,设置初始用户导致服务器超时
Server with authentication, testing using mocha, setting up the initial users causes the server to timeout
我已经构建了一个带有身份验证的网络服务器。这意味着当用户发出请求(登录、注册和注销除外)时,用户必须提供令牌。一切似乎都运行良好,我已经在前端使用它大约 2 周了,没有出现很多问题。如果令牌有效(在 Redis 存储中),它会完成 api 请求,或者 returns 一条 'unauthorised user' 消息。
问题是,我现在决定开始使用 mocha 彻底测试我所有的服务器端代码。
目前我能想到的唯一方法是,如下:
const createUser = function(data) {
return (
chai.request(server_addr)
.post('auth/register')
.set('content-type', 'application/x-www-form-urlencoded')
.type('form')
.send('userName=' + data.name)
.send('email=' + data.email)
.send('password=' + data.password)
);
}
before((done) => {
var users = [];
for (var i = 0; i < num_users; i++) {
users.push({
name: 'user_' + i,
email: 'test_' + i + '@gmail.com',
password: 'password_' + i
});
}
Promise.all(users.map(function(user) {
return createUser(user);
}))
.then(function(r) {
//Save the tokens some how, either in an array or otherwise.
done();
})
});
然后存储为每个注册用户返回的令牌。问题在于,使用当前方法,服务器实际上只是超时,只创建了 3 个用户。这也意味着我的测试必须遵循一个顺序,例如:user_1 必须登录然后他才能获取,POST 等等,因此这意味着我在寄存器周围拖来拖去测试几个文件。
我确定这不是最佳的处理方式?
我想了两个主意:
创建一些我从未退出的测试用户,因此他们的令牌有效,直到机器死机。这个问题是我必须在代码或环境变量中的某个地方硬编码这些令牌,如果我想尝试 100 个用户,它也不是那么可扩展。
我的第二个想法是在测试环境时关闭身份验证。这个问题是,在我当前的控制器代码的几个地方,我有这样的代码 req.user._id
,我通过解析 Redis 存储中的令牌来获取用户。我不喜欢为了满足我的测试而必须更改生产代码的想法。
对于这两种方法,是否还有其他人有任何替代方案,目前我倾向于选项 1,但我期待听到社区的回应。
谢谢,
您的第一个选择是解决此问题的理想方法。
Create a few test users that I just never sign out and therefore their tokens are valid, until the machine dies.
这是要走的路。更具体地说:
在开始测试之前创建一个 seeds the database 带有一些虚拟数据的脚本。理想情况下,您会创建一些假定已经注册的用户。
当然,您也应该测试注册流程,您自己注册一个全新的用户并测试它是否有效;避免使用此用户进行其他测试。相反,使用在初始种子设定中添加的用户之一。
创建一个模块,导出有关您为数据库设置种子的用户的数据。这样你就可以避免 hardcoding/repeating 你的用户和他们的令牌在你的测试中无处不在。
完成测试后,运行 另一个清除数据库的脚本。
理想情况下,运行 您针对 test 数据库进行测试,该数据库是您在开始测试之前设置的,并在测试之后拆除的。
现在你的第二个选择:
The second thought I had would be to turn off the authentication when the environment is in test...
我会避免这种情况。您应该按原样测试您的代码。您想要彻底测试您的身份验证系统也是完全有道理的。
使用 NODE_ENV=test
条件来改变 flow/or 重定向,例如:
- 在哪里发送用户注册电子邮件。
- 调用昂贵的 pay-per-call 外部服务等
测试时尽量不要滥用这个。必要时使用它,而不是为了方便。
The problem is that with the current approach, the server actually just times out, creating just 3 users
我猜这是一个代码问题,您需要自己调试。我已将我的回答重点放在您的测试 best-practices 问题上。
我已经构建了一个带有身份验证的网络服务器。这意味着当用户发出请求(登录、注册和注销除外)时,用户必须提供令牌。一切似乎都运行良好,我已经在前端使用它大约 2 周了,没有出现很多问题。如果令牌有效(在 Redis 存储中),它会完成 api 请求,或者 returns 一条 'unauthorised user' 消息。
问题是,我现在决定开始使用 mocha 彻底测试我所有的服务器端代码。
目前我能想到的唯一方法是,如下:
const createUser = function(data) {
return (
chai.request(server_addr)
.post('auth/register')
.set('content-type', 'application/x-www-form-urlencoded')
.type('form')
.send('userName=' + data.name)
.send('email=' + data.email)
.send('password=' + data.password)
);
}
before((done) => {
var users = [];
for (var i = 0; i < num_users; i++) {
users.push({
name: 'user_' + i,
email: 'test_' + i + '@gmail.com',
password: 'password_' + i
});
}
Promise.all(users.map(function(user) {
return createUser(user);
}))
.then(function(r) {
//Save the tokens some how, either in an array or otherwise.
done();
})
});
然后存储为每个注册用户返回的令牌。问题在于,使用当前方法,服务器实际上只是超时,只创建了 3 个用户。这也意味着我的测试必须遵循一个顺序,例如:user_1 必须登录然后他才能获取,POST 等等,因此这意味着我在寄存器周围拖来拖去测试几个文件。
我确定这不是最佳的处理方式?
我想了两个主意:
创建一些我从未退出的测试用户,因此他们的令牌有效,直到机器死机。这个问题是我必须在代码或环境变量中的某个地方硬编码这些令牌,如果我想尝试 100 个用户,它也不是那么可扩展。
我的第二个想法是在测试环境时关闭身份验证。这个问题是,在我当前的控制器代码的几个地方,我有这样的代码
req.user._id
,我通过解析 Redis 存储中的令牌来获取用户。我不喜欢为了满足我的测试而必须更改生产代码的想法。
对于这两种方法,是否还有其他人有任何替代方案,目前我倾向于选项 1,但我期待听到社区的回应。
谢谢,
您的第一个选择是解决此问题的理想方法。
Create a few test users that I just never sign out and therefore their tokens are valid, until the machine dies.
这是要走的路。更具体地说:
在开始测试之前创建一个 seeds the database 带有一些虚拟数据的脚本。理想情况下,您会创建一些假定已经注册的用户。
当然,您也应该测试注册流程,您自己注册一个全新的用户并测试它是否有效;避免使用此用户进行其他测试。相反,使用在初始种子设定中添加的用户之一。
创建一个模块,导出有关您为数据库设置种子的用户的数据。这样你就可以避免 hardcoding/repeating 你的用户和他们的令牌在你的测试中无处不在。
完成测试后,运行 另一个清除数据库的脚本。
理想情况下,运行 您针对 test 数据库进行测试,该数据库是您在开始测试之前设置的,并在测试之后拆除的。
现在你的第二个选择:
The second thought I had would be to turn off the authentication when the environment is in test...
我会避免这种情况。您应该按原样测试您的代码。您想要彻底测试您的身份验证系统也是完全有道理的。
使用 NODE_ENV=test
条件来改变 flow/or 重定向,例如:
- 在哪里发送用户注册电子邮件。
- 调用昂贵的 pay-per-call 外部服务等
测试时尽量不要滥用这个。必要时使用它,而不是为了方便。
The problem is that with the current approach, the server actually just times out, creating just 3 users
我猜这是一个代码问题,您需要自己调试。我已将我的回答重点放在您的测试 best-practices 问题上。