自动化测试-使用使用数据库存储测试用例和测试结果

来源:互联网 发布:知豆高速没电了怎么办 编辑:程序博客网 时间:2024/06/01 10:15

前面两篇博客介绍了使用XML存储测试用例和测试结果,并介绍了两种处理方式流处理模式和缓存处理模式,个人更喜欢缓存处理模式,呵呵。下面将介绍使用数据库存储测试用例和测试结果,缓存处理模式的自动化测试套件的编写。

1、  准备被测应用程序。参见自动化测试-使用XML存储测试用例1中的那个

2、  准备测试套件项目,并创建TestCase和TestCaseResult类。参见自动化测试-使用XML存储测试用例1

3、  准备数据库和数据。

在sql server中执行下面的脚本:我用的是sql server 2008

use master

go

if exists(select*from sysdatabases wherename='dbTestMethod')

drop database dbTestMethod

go

create database dbTestMethod

go

use dbTestMethod

go

create table tblTestCases

(

caseid char(4)primary key,

input char(14)not null,

expected varchar(35)not null,

)

go

insert into tblTestCases

values('0001','2 4 8','22.4286')

insert into tblTestCases

values('0002','1 5','3.0000')

insert into tblTestCases

values('0003','1 2 4 8 16 32','10.5000')

go

create table tblTestResults

(

resultid int identity(1,1)primary key,

caseid char(4)not null,

input char(14)not null,

expected varchar(35)not null,

actual varchar(35)not null,

result char(4)not null,

runat datetime not null

)

Go

这样就创建了数据库dbTestMethod,库中有两个表tblTestCases(测试用例表)和tblTestResults(测试结果表),在tblTestCases表插入了几条测试用例。当然,你完全可以不执行脚本,使用菜单创建库和表,以及通过界面插入数据。

4、 编写自动化测试套件

仍然是这几个步骤:读取测试用例、执行测试、存储测试结果,只不过方式略有不同而已。我创建了一个名为SQLBufferedHarness的类。封装了读取测试用例的方法readData、执行测试的方法runTest、存储测试结果的方法saveResult。
注意使用数据库存储用例和测试结果就会涉及数据库的连接和关闭操作,对此也做了封装。
SQLBufferedHarness.cs

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using MathLib;

using System.Collections;

using System.Data.SqlClient;

namespace TestHarnessDesignPartterns

{

    class SQLBufferedHarness

    {

        /// <summary>

        /// 打开数据库连接

        /// </summary>

        /// <param name="connecString"></param>

        /// <returns></returns>

        public SqlConnection openDBConnec(string connecString)

        {

            SqlConnection sc = new SqlConnection(connecString);

            sc.Open();

            return sc;

        }

        /// <summary>

        /// 读取测试用例

        /// </summary>

        /// <param name="sc"></param>

        /// <param name="cmd"></param>

        /// <returns></returns>

        public ArrayList readData(SqlCommand cmd)

        {

            SqlDataReader sdr=cmd.ExecuteReader();

            ArrayList tcd = new ArrayList();

            while (sdr.Read())//main loop

            {

                string caseid = sdr.GetString(0);

                string input = sdr.GetString(1);

                string expected = sdr.GetString(2);

                TestCase tc = new TestCase(caseid, input, expected);

                tcd.Add(tc);

            }

            return tcd;

 

        }

        /// <summary>

        /// 运行测试

        /// </summary>

        /// <param name="testCases"></param>

        /// <returns></returns>

        public ArrayList runTest(ArrayList testCases)

        {

            ArrayList tcr = new ArrayList();

            TestCase tc = null;

            TestCaseResult r = null;

            string actual = null;

            for (int i = 0; i < testCases.Count; ++i)

            {

                tc = (TestCase)testCases[i];

                string[] inputA = tc.input.Trim().Split(' ');//注意这里要使用Trim()将尾部空白字符串,可能会分解多个空白字符串,后面使用的时候会报字符串不符的错误。

                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");//如果我们结果写"*FAIL*",由于数据库该字段长度设置为4,因此会报截断字符串的错误

                tcr.Add(r);

            }//main processing loop

 

            return tcr;

        }

        public void saveResult(SqlConnection sc, ArrayList testResults)

        {

            TestCaseResult r=null;   

            for(int i=0;i<testResults.Count;++i)

                {

                r=(TestCaseResult)testResults[i];

                string runat=DateTime.Now.ToString("s");

                string insert="INSERT INTO tblTestResults VALUES('"+r.id+"','"+r.input+"','"+r.expected+ "','"+r.actual+"','"+r.result+"','"+runat+"')";

                SqlCommand scInsert=new SqlCommand(insert,sc);

                scInsert.ExecuteNonQuery();

                }

               

        }

        /// <summary>

        /// 关闭数据库连接

        /// </summary>

        /// <param name="sc"></param>

        public void closeDBConnec(SqlConnection sc)

        {

            sc.Close();

        }

    }

}

然后我们main方法中调用:

SqlConnection connec = null;

SQLBufferedHarness h = new SQLBufferedHarness();

 try

            {

                string dbConnec = "Server=(local);Database=dbTestMethod;Trusted_Connection=yes";

 

                connec = h.openDBConnec(dbConnec);

                SqlCommand cmd = new SqlCommand("select * from tblTestCases", connec);

                ArrayList testCases = h.readData(cmd);

                h.closeDBConnec(connec);//奇怪一个连接不能被共享吗,不关闭会报错

                ArrayList testResults = h.runTest(testCases);

                connec = h.openDBConnec(dbConnec);

                h.saveResult(connec, testResults);

 

            }

            catch (Exception ex)

            {

                Console.WriteLine("Fatal error:" + ex.Message);

            }

            finally

            {

                h.closeDBConnec(connec);

            }

运行看一下效果吧。我在运行过程中出现过几个问题,经调试解决了,在代码中有注释。
原创粉丝点击