VisualStudio2010-Test Driven Development(二)

测试驱动开--怎样实现由红到绿

 

下面我们会介绍怎样在Visual Studio2010中实现一个测试驱动开发的过程. 这里主要介绍的是Visual Studio 2010对TDD的支持功能. 因此对于TDD是什么很TDD的详细实现过程没有更多的赘述.

 

Task1-- Create a New Project

 

1.  创建一个新的Project. 选择New Project, 选择C#语言和.NetFramework4.0 , 通过选择Class Library模板来创建这个新的Project.

2.  给新的Project 命名为SimpleDataStructures. 选择OK 完成创建

3.  在新的Project中 删除已经创建好了Class1.cs文件.

4.  在SolutionExplorer中, 右键选择SimpleDataStructures solution 并且选择 Add->New Project 在弹出的对话框中选择 Visual C#-> Test. 选择TestProject 并且确认.NetFramework4.0被选中.

5.  修改新的项目名称为 SimpleDataStructures.Tests 点击OK 创建新的项目完成.

6.  删除新创建的测试项目中的 UnitTest1.cs 文件. 

 

 

Task 2 – Defininga Context for the Tests.

 

前面已经完成了项目的创建, 下面我们将开始创建测试的内容. 我们将写一组测试用例用来驱动SimpleStack类的设计.

 

首先我们需要创建一个文件用来存放一些用来测试SimpleStack类的测试用例,并且实现第一个测试用例. 我们会使用SmartTag来帮助我们实现一些必要的code, micro-code 或者其他的一些内容.

 

1.  创建一个新的类在SimpleDataStructures.Test中. 右键选择SimpleDataStructures.Test -> Add -> Class 选择Class 模板并且选择C#, 更改类的名字为SimpleStackTests 然后选择OK.

2.  打开SimpleStackTests.cs文件, 因为VisualStudio 默认创建的class会设置成是internal 的. 因为当前这个类需要让Test Runner能够找到并且可以执行.因此我们如果需要当前的class是public的

3.  如果希望在Visual Studio的Test Runner中识别到当前的类是一个测试类并且可以按照测试的方式去执行. 我们就需要给这个类加上一个TestClass Attribute . 因此我们需要将TestClass的Attribute添加到当前的SimpleStackTests类上 

 

 

4.  当们添加了[TestClass]Attribute后发现, VisualStudio不认识这个Attribute, 这是因为没有添加TestClass的引用.

5. 此时我们可以使用VisualStudio 2010中新增的Smart Tag action. 用来自动添加正确的引用. 首先选中TestClass.然后使用快捷方式 CTRL+. 会出现一个下拉筐选择第一项就添加了正确的应用.

 

 

6.  我们已经定义了一个测试框架, 但是在你写测试用例之前还是需要获取一些 context 用来界定我们所写的测试用例的测试内容.

注: 什么是context, 在TDD中context用例描述SimpleStack当前的条件和状态. "context"用来准确的描述在我们的测试中需要check的内容. 这样的描述比起其他的方式更具有可读性.

7.  按照TDD的原则. 我们首先要假设stack已经创建, 并且处于一个默认状态. 在设定了这样的context后. 我们需要重新命名SimpleStackTest类将其名字修改成一个更具有描述性的名字. WhenAsIsCreated

 

 [TestClass]

    public class WhenAStackIsCreated

    {

    }

 

Task 3 – Writingthe First Test: Designing and Defining the SimpleStack


在当前的这个Task中, 我们将通过前面定义好的测试中的context来designing和building SimpleStack 类. 我们同样会使用到Smart Tag action .

 

1.  首先创建一个新的test method, 用例描述新创建的stack 应该是空的. 添加TestMethod Attribute 到测试方法上. 通过测试方法的名字来描述测试方法的用途(测试目的). 例如: WhenAsStackIsCreatedThenItShouldBeEmpty() 这些名字能够帮助我们更好的理解每个测试方法的测试点是什么.

    [TestMethod]

        public void ThenItShouldBeEmpty()

        {

        }

 

2.  下一步, 我们需要声明一个新的 SimpleStack 对象, 并且验证它的IsEmpty属性返回的是否为true. 首先我们先声明一个SimpleStack.

3.  这里还会使用到VisualStudio2010中的新的功能Smart Tag. 但是跟之前的使用的场景有所不同. 在这里,VisualStudio 不知道SimpleStack类是什么, 因此Smart Tag 将提供一个生成方法的快捷方式.

 

 

4.  如上图所示, 选择 Generat class for "SimpleStack" .  在当前的project中将自动生成一个新的名字为SimpleStack的class  .

 如果选择的是Generate newtype…  将会出现一个对话框. 允许自定义将要生产的code. 如果选择了这个选项将会出现下面的对话框

首先是Location 部分, 在Location中可以选择当前生成的class放在哪个project中. 默认情况会放在当前的project中.

 

5.  回到刚才的测试中, 我们将通过IsEmpty属性来验证stack是否为空. Code 如下

 

    [TestMethod]

        public void ThenItShouldBeEmpty()

        {

            SimpleStack simpleStack = newSimpleStack();

            Assert.IsTrue(simpleStack.IsEmpty);

        }

6.  再次使用Smart Tag, 这次选择Generate property .. 选择这个选项将会生成一个public的属性在SimpleStack class中.

 

 

7.  查看SimpleStack.cs文件, 可以看到刚刚生成的property. 

 

8.  现在右键选择测试方法, 然后选择 Run Test (快捷键Ctrl+R,T). 我们将看到当前的测试用例的执行结果. 可以看到执行结果为fails.

9.  在TDD的方式中. 我们将使用简单的方式使得当前的测试处于pass的状态, 我们可以使用最简单的方式在getter方法中返回true;

 

   class SimpleStack

    {

        public bool IsEmpty

        {

            get { return true; }

        }

    }

 

10. 下面需要返回到test中; 这里我们通常会需要一个快速的导航到某个方法上的途径. 同样使用 CTRL+, 打开Quick Search dialog, 然后输入想要导航到的 method,class 或者file. 在Search terms: 中输入想要查找的内容, 下面会动态的出现当前solution中符合条件的List, 然后通过Up Down键就可以选择导航到目的地. 

 

11. 现在我们返回了测试方法, 再次执行测试. 当前的测试已经通过. 

 

 

Task 4 – AddingMore Functionality Driven by Tests


到目前为止, 我们几乎实现了一个空的SimpleStack . 这个类中只有一个简单的read-only 的属性. 现在我们可以继续使用 dreiving out the design with tests 的方式来添加新的方法.

 

1.  添加一个针对SimpleStack类的新的测试方法,Push method,插入一个整型数组的方法.

 

   [TestMethod]

        public voidThenShouldBeAbleToPushAnItemOntoTheStack()

        {

            var theStack = new SimpleStack();

            theStack.Push(1);

        }

2.  Push方法实际是没有实现的, 因此我们同样使用Smart Tag, 来生成相对的方法. CTRL+. 选择生成方法. 回车然后查看新生成的方法.

 

 

3.  再次执行测试用例, 发现当前的执行结果是fails.

按照上节我们介绍的TDD的原则 Red-Green-Refactor , 当前的状态是Red 我们需要通过简单的实现使现在的测试用例处于Gree的状态.

 

4.  当前的目的是使得测试通过. 作为真正的TDD, 我们需要做最简单的事情来让测试处于Green的状态: 我们将去掉 NotImplementedException方法. 这样我们就可以使得前面的测试处于通过状态. 

 

 internal void Push(int p)

        {

        }

 

5.  再次导航到ThenShouldBeAbleToPushAnItemOntoTheStack方法中, 此时同样可以使用CTRL+, 快捷方式将Quick Search 打开, 然后可以输入TSBA ,就可以过滤出这个方法,并且可以导航过去.

6.  再次执行测试. 此时测试又处于了通过的状态, 即Green.

 

 

 

上面用了一个简单的例子来实现TDD的方式, 更主要的是使用Visual Studio2010的新功能来支持TDD, 使得我们的TDD在实现的过程中更加快捷和方便. 其中一个重要的方式就是Smart Tag(CTRL+.). 他可以提供你当前所需要的各种智能的提示. 可以通过它来实现类, 方法的实现, 也可以实现命名空间的引用. 总之Smart Tag是一个很智能的方式, 在不同的情况下提供不同的智能选项用来加快我们的开发过程. 使得整个TDD的过程效率和质量都更大的提高.

 

后面我们还会继续介绍相关VisualStudio 2010 和TDD的相关内容.

 

posted @ 2010-06-20 23:25  cat's blog  阅读(815)  评论(0编辑  收藏  举报