Danny's profile季节的水滴PhotosBlogListsMore Tools Help

Blog


    1/18/2009

    ADO.NET测试(二) --测试有返回值的存储过程

         假如,我们要测试一个叫做usp_MoreThan()的存储过程,这个存储过程返回SQL表中价格高于输入数值的int值:
    create procedure usp_MoreThan
        @inputPrice money
    as
        declare @ans int
        select @ans = count(*) from tblPrices where price > inputPrice
        return @ans
    go
    1. int expected = 2;
    2. int actual;
    3. string input = "100.00";
    4. string connString = "Server=(local);Database=dbPrices;UID=userId;PWD=password";
    5. SqlConnection sc = new SqlConnection(connString);
    6. SqlCommend cmd = new SqlCommend("usp_MoreThan", sc);
    7. cmd.CommandType = CommandType.StoredProcedure;
    8. SqlParameter p1 = cmd.Parameters.Add("ret_val", SqlDbType.Int);
    9. p1.Direction = ParameterDirection.ReturnValue;
    10. SqlParameter p2 = cmd.Parameters.Add("@inputPrice", SqlDbType.Money);
    11. p2.Direction = ParameterDirection.Input;
    12. p2.Value = input;
    13. sc.open();
    14. if(actual == expected)
    15.     Console.WriteLine("Pass");
    16. else
    17.     Console.WriteLine("Fail");

    雪梅娘

    无意中在中山公园龙之梦竟然发现了这个,XM同学~嘿嘿

    1/13/2009

    在IKEA样板间竟然看到了这个

    如题,汗呐...不知道这个究竟说明了什么?

    注:小字部分为:"Display only, please do not use."

    1/7/2009

    ADO.NET测试(一) --当期望值是DataSet时

    设有一个用户信息的SQL表,表中有Iddescription两项。待测系统适用一个SqlDataAdapter对象从这个表里把数据读取到一个DataSet对象。

     

    假如对于一个特定的测试用例输入,期望的DataSet包含下面3项数据:                                      

    001

    Widget

    002

    Wadget

    003

    Wodget

    那么期望的聚合字符串就应该是:001Widget002Wadget003Wodget

     

    可以通过下面代码检查实际的DataSet对象是否包含期望的数据项:

    1.             string ds = new DataSet(); //把实际结果保存到DataSet ds

    2.              

    3.             string expectData = "001Widget002Wadget003Wodget";

    4.             string actualData = null;

    5.              

    6.             DataTable dt = ds.Tables[0];

    7.             foreach(DataRow de in dt.Rows)

    8.             {

    9.                 foreach(DataColumn dc in dt.Columns)

    10.             {

    11.                 actualData += dr[dc];

    12.             }

    13.         }

    14.          

    15.         if(actualData == expectData)

    16.             Console.WriteLine("Pass");

    17.         else

    18.             Console.WriteLine("Fail");

    我们应该首先取回实际DataSet对象里的DataTable对象,然后遍历它的DataRow集合,获得每个列的值,并且把它追加到字符串变量的后面。

     

    如果期望数据非常多,我们可以通过计算并比较这些数据的哈希值即可:

    1.             string ds = new DataSet();

    2.              

    3.             //string expectedData = "001Widget002Wadget003Wodget";

    4.             string expectedHash = "EC-5C-E5-E5-6D-1D-8C-DD-6E-2A-2B-6B-D3-CB-C1-28"

    5.             string actualData = null;

    6.             string actualHash = null;

    7.              

    8.             DataTable dt = ds.Tables[0];

    9.             foreach(DataRow de in dt.Rows)

    10.         {

    11.             foreach(DataColumn dc in dt.Columns)

    12.             {

    13.                 actualData += dr[dc];

    14.             }

    15.         }

    16.          

    17.         MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();

    18.         byte[] ba = md5.ComputeHash(Encodeing.ASCII.GetBytes(actualData));

    19.         actualHash = BitConverter.ToString(ba);  //返回一个用连字符号(-)连接的表示16进制数的字符串

    20.          

    21.         if(actualHash == expectedHash)

    22.             Console.WriteLine("Pass");

    23.         else

    24.             Console.WriteLine("Fail");

    通过比较期望值数据的MD5(Message Digest version 5)哈希值,可以避免存储非常多的期望字符串数据,因为所有MD5哈希值的长度都是16个字节。用于加密的哈希算法(和用于哈希表的哈希算法不同),其目的是为了产生一个字节序列的指纹,或者说摘要。因为哈希的过程是不可逆的,这些哈希值仅仅用于识别,而不是加密/揭秘。