测试可以优化的代码

时间:2011-07-29 10:47:42

标签: c# unit-testing tdd nunit

我只是用尝试,我为CachedEnumerable<T>课程撰写了以下测试:

[Test]
public void CanNestEnumerations()
{
    var SourceEnumerable = Enumerable.Range(0, 10).Select(i => (decimal)i);
    var CachedEnumerable = new CachedEnumerable<decimal>(SourceEnumerable);

    Assert.DoesNotThrow(() =>
        {
            foreach (var d in CachedEnumerable)
            {
                foreach (var d2 in CachedEnumerable)
                {

                }
            }
        });
}
  1. 嵌套的for循环是否会被优化掉,因为它们不会 什么(循环后从不使用CachedEnumerable?)

  2. 是否有任何(其他?)案例可能会优化测试代码 出?

  3. 如果是这样,我如何确保测试代码实际运行?

2 个答案:

答案 0 :(得分:3)

它不会被优化,因为它看起来更像是什么。代码实际上更像(改编自已接受的答案here):

using (IEnumerator<Foo> iterator = CachedEnumerable.GetEnumerator())
{
    while (iterator.MoveNext())
    {
        var d = iterator.Current;

        // Other loop
    }
}

编译器不知道调用MoveNext / Current是否存在副作用,因此必须调用它们。如果未使用d,则可能会优化分配。但它仍然需要调用Current。另一个循环也是如此。

所做的优化不应对您的代码产生任何逻辑影响。它会删除那些在正常条件下无效或永远不会被调用的东西。

答案 1 :(得分:1)

  

如果是这样,我如何确保测试代码实际运行?

您可以在单元测试项目的“属性”选项卡中禁用“优化代码”。它位于Build选项卡中。