数码幽灵的自学Blog

.Net 学习历程

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

Nunit各种不同的Setup和TearDown标记来帮助我们频繁的建立一致的测试环境,这种功能能帮助您确保一

个测试用例不会对其他任何一个测试用例产生作用(测试用例隔离-Test case isolation),而证明测试

用例隔离的最好例子就是以任何顺序执行您的测试

Nunit的Test Fixture是用来被一个或更多测试用例共享的用来初始化对象或是提供一些相关资源的装置

;按照Nunit的规定,一个Test Fixture就是一个标记了[TestFixture]属性的类,他的方法提供:
  [Test]标记一个测试用例,这个测试用例将作为一个原子操作而不依赖于其他的测试;
  [SetUp]和[TearDown]用来在测试用例间重置测试环境,在每个测试的开始和结束的时候,拥有这两个 

  标记的方法将被执行
  [TestFixtureSetup]和[TestFixtureTearDown]提供测试用例间需要共享的某些对象;标记了这两个属 

性的方法将在每个test fixture开始和结束的时候被执行;

任何一个在运行时你需要的对象都可以被作为一个[TestFixture]类的实例变量(被所有测试用例共享)或

是一个方法的本地变量(对于个别的测试用例可见),这就是为什么它被描述为test fixture的原因;也可

以认为Nunit的[TestFixture]是将一组测试表现为一个类的形式的一种方法;

现实世界中的TDD
两个问题:
1.在产品开发中贯穿的测试需要在发布时很容易的去掉测试模块部分
2.对于一个鼠标键盘驱动的GUI应用,你如何编写一个测试来模拟用户的操作?

问题的解决办法在于适当的将代码拆分为可以被分开编译,测试,和部署的独立模块;一个例子就是将

Quad类编译为一个分离的库文件.dll的方案优于将它编译为一个和执行代码混合的可执行的程序,因为这

将是我们可以独立的同时开发测试程序和域程序(domain program)作为分离的可执行文件使用共享的包含

Quad的类库.dll
TDD的一个规则是,无须测试第三方代码,所以我们没有必要去测试gui框架的类,虽然有时候测试ui是有

用的;意思就是说,你可以捕捉用户时间并由你正在开发的类来处理它;

接下来看看使用TDD开发一个combobox list的简单的winform程序:

编译以下代码为库CountryLib.dll
public class CountryList
{
    public String GetCountry(int No)
    {
        return null;
    }
}
编写测试用例:
[TestFixture]
public class CountryBoxTest
{
    [Test]
    public void CheckContent()
    {
        CountryLib.CountryList list = new
            CountryLib.CountryList();
       
        Assert.AreEqual("UK", list.GetCountry(1));
        Assert.AreEqual("US", list.GetCountry(2));
        Assert.AreEqual("CH", list.GetCountry(3));
        Assert.AreEqual(null, list.GetCountry(4));
    }
}
很明显,测试将会失败,因为CountryList.GetCountry()返回null;
接下来重构代码,为GetCountry方法填充正确逻辑,如下:
public class CountryList
{
    string one = "UK";
    string two = "US";
    string three = "CH";

    public string GetCountry(int No)
    {
        if ( No == 1 )
            return one;
        if ( No == 2 )
            return two;
        if ( No == 3 )
            return three;
        else
            return null;
    }
}
测试通过,一切正常;可能你想把代码改的更好看一点,例如使用ArrayList存储字符串,但在这里,这

并不是重点;
接下来创建一个winform项目,在窗体上放置一个combobox,并在初始化中写下如下代码:
private void InitializeComponent()
{
    ...

    CountryLib.CountryList list = new CountryLib.CountryList();

    String country;
    int index = 1;

    while ((country = list.GetCountry(index++)) != null)
       this.comboBox1.Items.Add(country);

    ...

}

从这里我们可以看到,我们应该思考,CountryList类怎样参与用户界面的交互操作,对应编写我们的测

试用例;简而言之就是将表现层代码和逻辑代码充分剥离!这也是众多设计方法所提倡的;

posted on 2004-06-26 15:39  数码幽灵  阅读(1461)  评论(2编辑  收藏  举报