我用 WatiN 编写了一个测试,当使用 F10 单步执行代码时,测试成功,但是当我从上下文菜单中执行“运行测试”命令时,测试失败。
这是我的测试:
[TestMethod]
[STAThread]
public void Should_show_captcha_after_three_invalid_login_attempts_with_invalid_username()
{
// Given
int numberOfLoginAttempts = 3;
// When
for (int loginAttempt = 1; loginAttempt <= numberOfLoginAttempts; loginAttempt++)
{
EnterUsername(LoginSettings.ValidUserName);
EnterPassword(loginAttempt.ToString());
ClickLoginButton();
// Check we are still on the loginpage
Assert.IsTrue(_browser.Title.Contains("Inloggen"));
}
bool isCaptchaVisible = _browser.Page<LoginPage>().Captcha.Exists;
// Then
Assert.IsTrue(isCaptchaVisible);
// Make sure to clear the login attempts for next test cases
RemoveLoginAttempts();
}
仅供引用:在数据库中,我们根据用户名跟踪登录尝试。当登录尝试次数 > 2 时,将显示验证码。我遇到的问题是数据库中的计数器保持为 1。当我手动单步执行测试时,计数器增加了。
这怎么可能?
最佳答案
嗯,你是对的,它必须是时机。然而问题的一部分是这不是单元测试,另一个是有大量异步的东西在你假设在你执行另一行测试代码之前已经完成,这些代码是在假设它的情况下编写的有。
例如,您的登录尝试循环中的计数绝对不是数据库中的计数。所有的事情都是平等的,它应该匹配,但是..
所以对我来说,您应该测试一下登录功能。 如果不成功,它将登录数据库中的 colunt,如果成功则重置该计数。 然后进行另一项测试,以查看当数据库中的登录尝试次数超过限制时,登录响应会检测到并显示正确的响应。
如果您想加入所有这些以进行端到端/白盒测试。然后应该使用一些描述的自动化测试。
我怀疑 Windows、浏览器、您的网络服务器甚至您的 dbms 都没有时间来完成第一次登录尝试的处理,然后您才排队另外两次,然后完成测试。而在 Debug模式下,在您逐步完成之间,他们有足够的时间。
关于c# - 单步执行测试时测试成功;否则不,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12707166/