2

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

2 回答 2

1

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

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

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

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

几个值得考虑的方法:

  1. 在执行数据库检查之前等待“合理”的时间,以允许 BizTalk 完成对消息的处理。
  2. 让 BizTalk 在处理完成之前输出一个日志文件(或其他一些证据),您可以在检查数据库之前对其进行检查。

即使方法有限,自动化集成测试也非常有价值。

于 2012-06-26T15:52:27.843 回答
0

更好的方法是在记录出现在这些表中的任何一个时通知并酌情通过/未通过测试。您可以使用基本的无限循环来连续轮询表,或者更优雅的解决方案是使用事件 - 有关更多详细信息,请参阅事件处理程序委托

于 2012-06-28T09:09:58.457 回答