Automated tests 如何确定BizTalk已完成对消息的处理

Automated tests 如何确定BizTalk已完成对消息的处理,automated-tests,biztalk,Automated Tests,Biztalk,我们正在为BizTalk应用程序编写自动化系统测试,但在确定何时可以执行测试验证时遇到问题。在验证之前,我们需要确保BizTalk已完全处理该消息,或者消息处理已超时 [Test] public void ReceiveValidTaskMessageTestShouldBeLoggedInMessageLog() { // Exercise MsmqHelpers.SendMessage(InboundQueueName, ValidMessage);

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

自动化集成测试的问题就在这里

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

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

然而,BizTalk不适合这种探测,因为它的构建没有考虑到测试(它的弱点之一)。我当然不知道该怎么做

有两种方法值得考虑:

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

    更好的方法是,当记录出现在这些表中的任何一个表中,并根据情况通过/失败测试时,会得到通知。您可以使用基本的无限循环来连续轮询表,或者更优雅的解决方案是使用事件-有关更多详细信息,请参阅