因此,我有一段时间前编写的身份验证模块。现在,我看到了自己的错误并为此编写了单元测试。在编写单元测试时,我很难想出好名字和好地方进行测试。例如,我有类似的东西
- 需要Login_should_redirect_when_not_logged_in
- 需要登录时登录_通过_登录_登录
- Login_should_work_when_given_proper_credentials
就个人而言,即使看起来“适当”,我还是觉得它有点丑陋。我也难以通过仅扫描测试来区分测试(我必须至少读取两次方法名称才能知道失败了)。
因此,我认为也许不编写纯粹测试功能的测试,而是编写一组涵盖场景的测试。
例如,这是我想出的一个测试存根:
public class Authentication_Bill
{
public void Bill_has_no_account()
{ //assert username "bill" not in UserStore
}
public void Bill_attempts_to_post_comment_but_is_redirected_to_login()
{ //Calls RequiredLogin and should redirect to login page
}
public void Bill_creates_account()
{ //pretend the login page doubled as registration and he made an account. Add the account here
}
public void Bill_logs_in_with_new_account()
{ //Login("bill", "password"). Assert not redirected to login page
}
public void Bill_can_now_post_comment()
{ //Calls RequiredLogin, but should not kill request or redirect to login page
}
}
这是听说过的图案吗?我已经看到了接受的故事等等,但这是根本不同的。最大的区别是我提出了“强制”测试的方案。而不是手动尝试提出可能需要进行测试的交互。另外,我知道这会鼓励单元测试不完全测试一种方法和类。我认为这还可以。另外,我知道这会给至少一些测试框架带来问题,因为它们通常假定测试彼此独立并且顺序无关紧要(在这种情况下,顺序是无关紧要的)。
无论如何,这是一个明智的模式吗?还是,这非常适合我的API的集成测试,而不是“单元”测试?这只是一个个人项目,因此我可以进行可能会或可能不会顺利进行的实验。
_test
附有测试内容的名称,并使用注释注明预期的结果。如果是个人项目,请找到自己喜欢的风格并坚持下去。