如何确定BizTalk已完成处理消息

时间:2012-06-26 13:10:12

标签: automated-tests biztalk

我们正在为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));
}

2 个答案:

答案 0 :(得分:1)

这就是自动化集成测试的问题。

此类测试是基于证据的,这反映在您的测试断言中;您正在寻找通过检查数据库进行处理的证据。

同样,为了知道处理已经完成,您正在寻找一些证据证明这种情况已经发生。例如,理论上您可以对BizTalk消息框数据库运行查询以检查其中的状态。

然而,BizTalk并不适合这种探测,因为它没有考虑到测试(其中一个缺点)。我当然不知道该怎么做。

值得考虑的几种方法:

  1. 在执行数据库检查之前等待“合理”的时间以允许BizTalk完成处理消息。
  2. 让BizTalk在处理完成之前输出一个日志文件(或其他一些证据),您可以在检查数据库之前检查它。
  3. 尽管方法有限,但自动化集成测试非常有价值。

答案 1 :(得分:0)

如果记录出现在其中任何一个表中并且适当地通过/未通过测试,则会通知更好的方法。您可以使用基本的无限循环来连续轮询表,或者更优雅的解决方案是使用事件 - 有关更多详细信息,请参阅event handler delegate