我正在为一项服务开展一些测试自动化工作,并找出一种简洁的方式将一些常见的设置&验证卷入“会话”类。如何检查是否有任何异常已被抛出?
从概念上讲,一个测试用例可能是这样的:
using (var managerSession = new Session(managerRole))
{
// A manager puts some items in warehouse
}
using (var employeeSession = new Session(employeeRole))
{
// An employee moves items from warehouse to store
}
using (var customerSession = new Session(customerRole))
{
// A customer can buy items from the store
}
在Session对象构造我设置为我和每个角色等适当的认证测试服务的连接,并在会议上的Dispose ()方法我有一个通用的验证块,例如,检查在会话生存期内没有发生服务器端错误或警告。
当然,这是滥用IDispose模式,如果使用块内的测试代码引发异常,并且验证块也会引发异常,则第二个异常将掩盖第一个异常。
从概念上讲,如果我们有这样的场景:
using (var managerSession = new Session(managerRole))
{
Assert.IsTrue(managerSession.DoJob(), "Manager did not do his job");
}
...和断言失败或调用managerSession.DoJob()抛出一个异常,那么我想会话的Dispose()方法跳过验证模块,即
public void Dispose()
{
if (NoExceptionThrown())
{
Assert.IsFalse(this.serviceConnection.HasErrors(), "Service connection has errors");
}
this.serviceConnection.Dispose();
}
...这样的测试方法从来没有失败,“服务连接有错误”,如果它实际上失败,“经理没做工作”,
我的问题是:是否可以在这里实现'NoExceptionThrown()'方法?是否有一些全局属性可以检查,或者可以使用Thread.CurrentThread中隐藏的某些东西?
更新:
我的问题是不如何重构这个:-)
我当然可以使用这个模式来代替:
Session.ForRole(managerRole, (session) => { /* Test code here */ });
用静态方法ForRole()如
public static void ForRole(Role r, Action<Session> code)
{
var session = new Session(r);
try
{
code(session);
Assert.IsFalse(session.serviceConnection.HasErrors());
}
finally
{
session.Dispose();
}
}
但是我很好奇是否存在某种如上所述的抓取异常状态的方式。
两件事。首先,是的,这是滥用'IDisposable'。使用'IDisposable'来表示“我拥有应该尽快释放的非托管资源”。使其意味着别的东西使你的代码难以阅读。其次,你是否担心*任何*异常,或者只*未被捕获*异常?假设测试代码抛出一个异常,捕获它并正常完成。应该标记? –
啊,我只关心_uncaught_异常。我会更新这个问题...... – Christoffer
至于滥用IDisposable:我实际上更关心的是错过每次会话的常见验证,而不是潜在的错误掩盖,所以这个问题更多的是“很高兴有”功能。实际的测试代码块包含10-100行UI自动化代码,并且我们已经发现缺陷未被发现,因为验证步骤中的一个在其中一个块中错过了(或报告在错误的块中)。 – Christoffer