【问题标题】:Integration Test for WCF/SQL Server too slow?WCF/SQL Server 的集成测试太慢?
【发布时间】:2012-05-29 13:46:04
【问题描述】:

我有一个集成测试一直失败(在 Visual Studio 中),但是,通过查看数据库来验证结果表明这里测试的系统实际上是成功的。

这是测试的基本思路:

private static readonly EfContext db = new EfContext();

[TestMethod]
void Complete_System_Run_Through_Is_Successful()
{
    // Create a new unique message and request...
    var message = Guid.NewGuid().ToString();
    var request = new FooRequest { Message = message };

    var fooClient = null; /* WCF proxy */
    try
    {
        // Call the service...
        fooClient = new FooClient();
        fooClient.CallService(fooRequest);
    }
    finally
    {
        // Close client or Abort faulted client...
        var channel = fooClient as ICommunicationObject;
        try
        {
            if (channel.State != CommunicationState.Faulted)
                channel.Close();
        }
        catch { channel.Abort(); }
    }

    // Verify there are 15 instances (traces) present in the database...
    var actualNumberOfTraces = db.Traces.Count(x => x.Message == message);
    Assert.AreEqual(15, actualNumberOfTraces);
}

正在测试的 WCF 服务会触发一系列其他下游服务(想想“服务总线”),其中每个侦听服务都会向数据库添加一个条目(跟踪)。从头到尾,这个过程记录了每个完整系统运行中的 15 条这些痕迹。

验证数据库中的结果表明测试运行成功(数据库中存在所有 15 个跟踪)。但是,测试运行失败(在 Visual Studio 中),发现的实际跟踪数在 3-6 之间。我唯一能想到的是,Assert 被调用得太早(即数据库尚未完成更新)。

无论如何,一切正常,所有痕迹确实存在于数据库中,我只是在这个测试中遇到了问题。有什么建议吗?

【问题讨论】:

  • 我会建议不要 try{... } finally{} 没有捕获(包含 Assert.Fail 如果在异常情况下需要什么?) - 或 wcf 代理的 using 块('fooclient')。有什么可以转移到测试开始或测试清理方法的吗?
  • 我已更新代码示例以包含关闭/中止逻辑。这是关闭/中止 WCF 代理的首选方式,而不是 using 语句。基本上,try/finally 块用于处理关闭/中止,而不是异常。
  • 我也会在外部尝试中放置一个 catch 块。
  • @Blam,同意,如果我想要处理异常,因为客户端调用了 one way 操作,所以我不想处理。从第一个 try 块中捕获异常不会增加任何价值。
  • 如果 fooClient = new FooClient();或 fooClient.CallService(fooRequest);抛出你不想知道的错误?您仍然可以转发异常。

标签: c# .net sql-server wcf integration-testing


【解决方案1】:

目前最丑陋的解决方案是添加Thread.Sleep(250) 以让数据库有时间赶上。如果你能想出一个更优雅的解决方案,我绝对有兴趣听到它!

【讨论】:

  • 一个更好的方法是等待,并在一个循环中多次尝试断言,只要你认为合理(比如最多 30 秒)。在代码中添加任意睡眠会使测试变得不确定,并且会在不同规格的机器上失败。
  • 这是一个好主意,您能否发布一个示例,说明如何执行 Task[]、WaitAll() 像您所说的那样在循环中调用 Assert?只是让我快速入门?
【解决方案2】:

看起来你有一个异步方法调用。本文介绍 WCF 同步和异步行为。

How to Call WCF Services Synchronously and Asynchronously

【讨论】:

  • 这些服务使用 MSMQ 绑定/(单向操作)是异步的。真的,我只是想弄清楚这个测试是否真的会通过。由于这些断开连接的服务的性质,我开始认为它不会。
  • 使用 asynch 你不应该期望它通过,所以我只是看不出它是如何增加任何价值的。我认为您需要一种不同的方法来测试它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-31
  • 1970-01-01
  • 1970-01-01
  • 2021-12-05
  • 2021-06-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多