|
四、 “附加测试属性”的实践
在Form1Test.cs中有这么一个功能,这又是VSTS单元测试之强大的地方。
我们可以点开它,点开后我们看到如下的代码:
#region 附加测试属性
//编写测试时,可使用以下附加属性:
//使用 ClassInitialize 在运行类中的第一个测试前先运行代码
//[ClassInitialize()]
//public static void MyClassInitialize(TestContext testContext)
//{
//}
//使用 ClassCleanup 在运行完类中的所有测试后再运行代码
//[ClassCleanup()]
//public static void MyClassCleanup()
//{
//}
//使用 TestInitialize 在运行每个测试前先运行代码
//[TestInitialize()]
//public void MyTestInitialize()
//{
//}
//使用 TestCleanup 在运行完每个测试后运行代码
//[TestCleanup()]
//public void MyTestCleanup()
//{
//}
#endregion
这是干什么的呢?呵呵,其实它已经说的很明白了,这是“附加测试属性”。默认都是被注释
掉的,只要我们取消注释就可以使用了。具体的属性有:[ClassInitialize()]、[ClassCleanup()]、
[TestInitialize()]、[TestCleanup()]。他们的作用在它们上面的注释里都已经讲的很明白了,笔者在
这里就不展开叙述了。
微软之所以加进来这么个功能,以我之所见,是为了加大测试的灵活性。
我举一例,中国IT实验室大家就会看得很明白:现在我
们打算把测试报告输出到外部文档去,这样方便日后的缺陷跟
踪。可以修改代码如下:
#region 附加测试属性
//编写测试时,可使用以下附加属性:
//使用 ClassInitialize 在运行类中的第一个测试前先运行代码
[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 在运行完类中的所有测试后再运行代码
[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 在运行每个测试前先运行代码
[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 在运行完每个测试后运行代码
//[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的单元测试的功能之强大由此可见一斑,本人更希望以此文能召唤起更多的国内公司能更
加重视软件测试,更加规范软件测试,把我国的软件测试行业做强、做精! |
|