crategev 发表于 2008-8-21 14:41:13

VS2005 Team Suite 轻松搞定白盒测试

四、 “附加测试属性”的实践
      在Form1Test.cs中有这么一个功能,这又是VSTS单元测试之强大的地方。
我们可以点开它,点开后我们看到如下的代码:
      #region 附加测试属性
      //编写测试时,可使用以下附加属性:
      //使用 ClassInitialize 在运行类中的第一个测试前先运行代码
      //
      //public static void MyClassInitialize(TestContext testContext)
      //{
      //}
      //使用 ClassCleanup 在运行完类中的所有测试后再运行代码
      //
      //public static void MyClassCleanup()
      //{
      //}
      //使用 TestInitialize 在运行每个测试前先运行代码
      //
      //public void MyTestInitialize()
      //{
      //}
      //使用 TestCleanup 在运行完每个测试后运行代码
      //
      //public void MyTestCleanup()
      //{
      //}
      #endregion
      这是干什么的呢?呵呵,其实它已经说的很明白了,这是“附加测试属性”。默认都是被注释
掉的,只要我们取消注释就可以使用了。具体的属性有:、、
、。他们的作用在它们上面的注释里都已经讲的很明白了,笔者在
这里就不展开叙述了。
      微软之所以加进来这么个功能,以我之所见,是为了加大测试的灵活性。
我举一例,中国IT实验室大家就会看得很明白:现在我
们打算把测试报告输出到外部文档去,这样方便日后的缺陷跟
踪。可以修改代码如下:
      #region 附加测试属性
      //编写测试时,可使用以下附加属性:
      //使用 ClassInitialize 在运行类中的第一个测试前先运行代码
      
      public static void MyClassInitialize(TestContext testContext)
      {
            StreamWriter m_streamWriter = new StreamWriter(@"C:\log.txt", true);
            m_streamWriter.Write("Test Time,");
            m_streamWriter.WriteLine(DateTime.Now);
            m_streamWriter.Flush();
            m_streamWriter.Close();
      }
      //使用 ClassCleanup 在运行完类中的所有测试后再运行代码
      
      public static void MyClassCleanup()
      {
            StreamWriter m_streamWriter = new StreamWriter(@"C:\log.txt", true);
            m_streamWriter.WriteLine("");
            m_streamWriter.Write("Total Passed:,");
            m_streamWriter.WriteLine(Convert.ToString(Passed) + ",");
            m_streamWriter.Write("Total NotPassed:,");
            m_streamWriter.WriteLine(Convert.ToString(NotPassed) + ",");
            m_streamWriter.Flush();
            m_streamWriter.Close();
      }
      //使用 TestInitialize 在运行每个测试前先运行代码
      
      public void MyTestInitialize()
      {
            StreamWriter m_streamWriter = new StreamWriter(@"C:\log.txt", true);
            if (actual == expected)
            {
                m_streamWriter.WriteLine("Test Passed");
                Passed++;
            }
            else
            {
                m_streamWriter.Write("Test NotPassed,");
                m_streamWriter.Write("Input X:,");
                m_streamWriter.Write(Convert.ToString(x) + ",");
                m_streamWriter.Write("Input Y:,");
                m_streamWriter.Write(Convert.ToString(y) + ",");
                m_streamWriter.Write("Expected:,");
                m_streamWriter.Write(Convert.ToString(expected) + ",");
                m_streamWriter.Write("Actual:,");
                m_streamWriter.Write(Convert.ToString(actual));
                m_streamWriter.WriteLine("");
                NotPassed++;
            }
            m_streamWriter.Flush();
            m_streamWriter.Close();
      }
      //使用 TestCleanup 在运行完每个测试后运行代码
      //
      //public void MyTestCleanup()
      //{
      //}
      #endregion
同时引用:using System.IO;
申明变量:static int Passed=0;
      static int NotPassed=0;
      static double expected;
      static double actual;
      static char x;
      static int y;
并且把测试用例里的对于x、y、actual、expected的申明删除
      这时候我们再点击进行测试后,就会在c:\下面生成log.txt,内容如下:
Test Time,2007-7-7 23:29:57
Test Passed
Test NotPassed,Input X:,B,Input Y:,3,Expected:,1.31,Actual:,1.32
Test Passed
Test NotPassed,Input X:,A,Input Y:,0,Expected:,8.88,Actual:,2.88
Test Passed
Total Passed:,3,
Total NotPassed:,2,
      可能大家在以上文本或者代码中感到奇怪:为什么要加进去那么多的逗号?
      原因在此:把log.txt更名为log.csv,那么,就可以用excel来打开它(如下表):

      这样清晰多了吧?而且更加易于维护
      笔者在这里只是拿外部文件的输出作为一个例子,“附加测试属性”的其它有意义的用途欢迎
大家共同探讨
结束语
      VSTS的单元测试的功能之强大由此可见一斑,本人更希望以此文能召唤起更多的国内公司能更
加重视软件测试,更加规范软件测试,把我国的软件测试行业做强、做精!
页: [1]
查看完整版本: VS2005 Team Suite 轻松搞定白盒测试