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的相关内容.