上篇博客介紹了使用XML存儲測試用例,流處理模式的自動化測試程序的編寫,這篇將介紹使用XML存儲測試用例,緩存處理模式的自動化測試程序的編寫。即先將所有測試用例讀取出來放到一個ArrayList中,執行的時候從這個ArrayList中拿測試用例,並把測試結果統一放到另一個ArrayList中,最後將第二個ArrayList中的測試結果保存到外部XML文件中。
參考上篇博客
1、 準備被測應用程序
2、 準備XML格式的測試用例
3、 準備TestCase類和TestCaseResult類
下面就開始自動化測試套件的設計了。
上篇博客代碼寫得有點亂,沒做任何整理。其實任何測試的執行都會包括讀取測試用例、執行測試、保存測試結果這幾個步驟。因此在此例子中我會將代碼封裝到方法中。
4、 編寫自動化測試代碼
上篇博客好像忘記說要添加被測應用程序的引用了。
在上篇博客創建的那個TestHarnessDesignPartterns項目下創建一個XMLBufferedHarness類。
該類中封裝了三個方法,ReadData()方法讀取測試用例,RunTests()方法執行測試,SaveResults()方法將測試結果存儲到外部XML中。我通過該類的構造函數將測試用例文件和測試結果文件傳遞給該類。即該類有個這樣簽名的構造函數:
public XMLBufferedHarness(string testCaseFile,string testResultFile)
XMLBufferedHarness類的全部代碼如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using MathLib;
using System.Collections;
using TestHarnessDesignPartterns;
namespace TestHarnessDesignPartterns
{
class XMLBufferedHarness
{
private XmlTextReader xtr = null;
private XmlTextWriter xtw = null;
private ArrayList tcd = null;//test case data
private ArrayList tcr = null;//test case results
string id, input, expected, actual;
TestCase tc = null;
TestCaseResult r = null;
public XMLBufferedHarness(string testCaseFile,string testResultFile)
{
xtr = new XmlTextReader(testCaseFile);
xtw = new XmlTextWriter(testResultFile, System.Text.Encoding.UTF8);
xtr.WhitespaceHandling = WhitespaceHandling.None;
xtw.Formatting = Formatting.Indented;
tcd = new ArrayList();
tcr = new ArrayList();
}
public void ReadData()
{
//use xtr to read datafile into tcd here
while (!xtr.EOF)//main loop
{
if (xtr.Name == "testcases" && !xtr.IsStartElement()) break;
while (xtr.Name != "case" || !xtr.IsStartElement())
xtr.Read();//advance to a<case>element if not there yet
id = xtr.GetAttribute("id");
xtr.Read();//advance to<input>
input = xtr.ReadElementString("input");//advance to<expected>
expected = xtr.ReadElementString("expected");//advance to</case>
tc = new TestCase(id, input, expected);
tcd.Add(tc);
xtr.Read();//advance to next<case>or</TestResults>
}
xtr.Close();
}
public void RunTests()
{
//run tests,store results to tcr here
for(int i=0;i<tcd.Count;++i)
{
tc=(TestCase)tcd[i];
string[] inputA = tc.input.Split(' ');
int [] inputs=new int[inputA.Length];
for (int j = 0; j < inputA.Length; ++j)
inputs[j] = int.Parse(inputA[j]);
actual = Methods.ArithmeticMean(inputs).ToString("F4");
if (actual == tc.expected)
r = new TestCaseResult(tc.id, tc.input, tc.expected, actual, "Pass");
else
r = new TestCaseResult(tc.id, tc.input, tc.expected, actual, "*FAIL*");
tcr.Add(r);
}//main processing loop
}
public void SaveResults()
{
//save results to resultfile here
xtw.WriteStartDocument();
xtw.WriteStartElement("TestResults");//root node
for (int i = 0; i < tcr.Count; ++i)
{
r = (TestCaseResult)tcr[i];
xtw.WriteStartElement("case");
xtw.WriteStartAttribute("id", null);
xtw.WriteString(r.id); xtw.WriteEndAttribute();
xtw.WriteStartElement("input");
xtw.WriteString(r.input); xtw.WriteEndElement();
xtw.WriteStartElement("expected");
xtw.WriteString(r.expected); xtw.WriteEndElement();
xtw.WriteStartElement("actual"); xtw.WriteString(r.actual);
xtw.WriteEndElement();
xtw.WriteStartElement("result");
xtw.WriteString(r.result); xtw.WriteEndElement();
xtw.WriteEndElement();//</case>
}
xtw.WriteEndElement();//</TestResults>
xtw.Close();
Console.WriteLine("\nEnd test run\n");
}
}
}
當然該類封裝的並不是很好,通用性不強,不是很好的面向對象的設計。如果是設計自動化測試框架,讀取測試用例、執行測試、存儲測試結果這幾個步驟應該可以更抽象。
好了,先不管這麼多,我們在main函數中調用下:
string stamp = DateTime.Now.ToString("s");
stamp = stamp.Replace(":", "-");
string testCaseFile = "..\\..\\..\\..\\TestCase\\DesignPatternTestCases.xml";
string testResultFile = "..\\..\\..\\..\\TestResult\\XMLFileStreamingResults-"+stamp+".xml";
try
{
XMLBufferedHarness h1 = new XMLBufferedHarness(testCaseFile, testResultFile);
h1.ReadData();
h1.RunTests();
h1.SaveResults();
}
catch (Exception ex)
{
Console.WriteLine("Fatal error:" + ex.Message);
}
運行下吧,看看效果。