自動化測試-使用XML存儲測試用例2

上篇博客介紹了使用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);

            }

運行下吧,看看效果。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章