我们正在为BizTalk应用程序编写自动化系统测试,但在确定何时可以执行测试验证时遇到问题。在验证之前,我们需要确保BizTalk已经完全处理了消息,或者消息处理已经超时。
[Test]
public void ReceiveValidTaskMessageTestShouldBeLoggedInMessageLog()
{
// Exercise
MsmqHelpers.SendMessage(InboundQueueName, ValidMessage);
// Verify
Assert.That(() => GetMessageCount("ReceiveError"), Is.EqualTo(0).After(1000));
Assert.That(() => GetMessageCount("Receive"), Is.EqualTo(1).After(1000));
}
最后两行检查sql server中的表中是否存在消息副本,一个表是成功消息,一个表是错误。
这里的问题是,在发送消息后,我们立即验证错误表中没有放置任何消息。但是,如果BizTalk尚未处理该消息,那么该断言即使在失败时也会通过。
我们需要的是这样的事情:
[Test]
public void ReceiveValidTaskMessageTestShouldBeLoggedInMessageLog()
{
// Exercise
MsmqHelpers.SendMessage(InboundQueueName, ValidMessage);
// Verify
Assert.That(() => PendingMessages, Is.EqualTo(0).After(1000));
Assert.That(() => GetMessageCount("ReceiveError"), Is.EqualTo(0));
Assert.That(() => GetMessageCount("Receive"), Is.EqualTo(1));
}
答案 0 :(得分:1)
这就是自动化集成测试的问题。
此类测试是基于证据的,这反映在您的测试断言中;您正在寻找通过检查数据库进行处理的证据。
同样,为了知道处理已经完成,您正在寻找一些证据证明这种情况已经发生。例如,理论上您可以对BizTalk消息框数据库运行查询以检查其中的状态。
然而,BizTalk并不适合这种探测,因为它没有考虑到测试(其中一个缺点)。我当然不知道该怎么做。
值得考虑的几种方法:
尽管方法有限,但自动化集成测试非常有价值。
答案 1 :(得分:0)
如果记录出现在其中任何一个表中并且适当地通过/未通过测试,则会通知更好的方法。您可以使用基本的无限循环来连续轮询表,或者更优雅的解决方案是使用事件 - 有关更多详细信息,请参阅event handler delegate。