zoukankan      html  css  js  c++  java
  • [Study Note] TDD: Consistent test structure (测试代码的结构一致性)

    在 codebetter 上看到 Mark Needham 的一篇文章 TDD: Consistent test structure,对于测试代码的结构进行了探讨。

    在以下的两个结构相近/内容相反的测试函数中有什么不同么?

    1 [Test]
    2  public void ShouldSetSomethingIfWeHaveAFoo()
    3 {
    4   var aFoo = FooBuilder.Build.WithBar("bar").WithBaz("baz").AFoo();
    5
    6    // some random setup
    7    // some stubs/expectations
    8  
    9   var result = new Controller(...).Submit(aFoo);
    10
    11   Assert.That(result.HasFoo, Is.True);
    12 }
    1 [Test]
    2  public void ShouldNotSetSomethingIfWeDoNotHaveAFoo()
    3 {
    4 // some random setup
    5 // some stubs/expectations
    6  
    7 var result = new Controller(...).Submit(null);
    8
    9 Assert.That(result.HasFoo, Is.False);
    10 }

    只要留意代码,就能看出第二段测试代码中使用 Inline 将变量 aFoo 直接赋值为 null,然后传递了进去。

    Needham 的同事 Damian 说,Inline 使得在将来(比较长的一段时间之后)阅读代码的时候,这两个相互印证的测试在结构上显得不一致,从而影响对于测试代码整体的理解。

    Needham 推荐的了一种单元测试函数的“结构”,如下: 

    1 [Test]
    2  public void ShouldShowTheStructureOfMarksTests()
    3 {
    4 // The test data that’s important for the test
    5 // Less important test data
    6 // Expectation/Stub setup
    7 // Call to object under test
    8 // Assertions
    9  }
    10  

    我这里还有一种更简单一点的结构:

    1 [Test]
    2  public void SimpleStructureOfMarksTests()
    3 {
    4 // Assign
    5 // Act
    6 // Assert
    7 }

    其实在这里讨论的,无非是如何能够更好的保证代码可读性,即使测试的代码也不例外,以前确实没有注意到这方面的问题。

    那么我的问题是,如果两边都采用 inline 方式呢?而且我以为,inline 可以带来一点点编译上的性能优势。

    inline, or not inline 可能是关于个人编码风格的问题吧。

  • 相关阅读:
    为了抓包某APP所做的尝试(to be continued)
    VirtualBox的使用的一些Tips 网络配置|硬盘扩充
    斜线和反斜线简要历史,为什么windows和unix采用不同的路径分隔符
    求出二维数组主对角线、次对角线以及周边元素之和
    C#计算两个时间的时间差,精确到年月日时分秒
    C#获取MP3,WMA信息
    C#窗体随意移动
    DEV GridControl小结
    DEV 皮肤的使用
    C#窗体阴影
  • 原文地址:https://www.cnblogs.com/zhaorui/p/20100401_test_structure.html
Copyright © 2011-2022 走看看