我想为我的网络应用编写一些测试用例,但是在某些情况下,例如“此令牌应该在30天内过期”。没有人喜欢在测试结束前等待30天。
还有一些关于某些预定事件发生的案例,例如“在用户注册后2周发送此电子邮件”,“在下一个结算日期前2天生成帐单”等。
您在编写此类测试用例时有什么建议?或者,是否有另一种方法可以确保这些功能与设计的一样精确?
答案 0 :(得分:4)
我在编写这些测试时的方法是以毫秒为单位定义到期时间。这样您就可以轻松编写测试,因为您的测试环境可以定义1 ms的到期时间。生产环境显然会定义适当的持续时间。通常,这些可以设置为配置值或db值。
答案 1 :(得分:1)
我想你有一些像
这样的代码if(token.ExpirationDateTime > DateTime.Now)
{
// do some job to expire
}
通常我使用类型为Func<DateTime>
的注入字段为类提供此类逻辑。例如
public class ExpirationManager
{
private Func<DateTime> _nowProvider;
public ExpirationManager(Func<DateTime> nowProvider)
{
_nowProvider = nowProvider;
}
}
然后到期代码看起来像
if(token.ExpirationDateTime > _nowProvider())
{
// do some job to expire
}
通过这种方式,您可以在进行测试时(例如单元测试)将实际系统时间替换为您想要的任何数据时间。
答案 2 :(得分:0)
断开功能并测试各个步骤。
在一定时间之后使项目到期包括将项目放在具有到期时间戳的某个地方,而另一部分程序使用旧时间戳将项目到期。因此,请使用正确的时间戳测试新项目是否正确插入,并且过期代码正确删除30天或更早的项目。为了测试,插入和移除的项目不必相同。
同样适用于在一定时间间隔后发送的电子邮件。