• .net软件自动化测试笔记(API-1)


    .net 软件测试自动化之道

    API(Application Programming Interface)包括单元测试(Unit Testing),模块测试(Module Testing),组件测试(Component Testing ),元件测试(Element Testing)

    为了将测试的程序和用于测试他们的测试套件(test harness)区分,待测程序叫做SUT(System Under Test),AUT(Application Under Test)或IUT(Implementation Under Test)

    手工测试这个API包括:
    创建一个小的测试程序,把Methods类拷贝到测试程序,针对待测试方法硬编码(hard-coding)输入一些值,运行这个存根程序(stub program)得到实际输出结果,然后比较实际结果和预期结果是否一致。把测试结果记录到excel表格或类似数据存储文件。

    自动话测试的优势:

    速度:可以非常快速的运行成千上万个测试用例
    精确性:不受人为因素干扰,可以记录测试结果
    确定性:每次以同样的方式运行
    效率:时间不受限制
    提高技能:提高测试人员的兴趣还有自身技能

    如下流程,很值得学习

    1.1创建文本文件以及数据
    如何在简单的文本文档创建并存储用于API测试用例的数据(可以独立于测试套件存在[比较倾向于这个方式],也可以嵌入测试套件)
    设计:使用逗号作为分隔符的文本文件,包含唯一测试用例Id,一个或多个输入值和期望结果
    方案:
    001:ArithmeticMean:2 4 8:4.6777
    002:ArithmeticMean:1 5:3.000
    003:ArithmeticMean:1 5:6.00000:deliberate failure

    每个测试用例有4个字段(用":"分开),测试用例ID,待测方法,测试用例输入(由空格分开)以及期望结果

    1.2使用数据
    如何从测试用例文件读入每条测试用例
    设计:通过while循环遍历测试用例文件的每一行,使用system.IO.StreamReader对象读入测试用例

      //使用测试数据
            public void UseData()
            {
                FileStream fs=new FileStream("..\TestCases.txt",FileMode.Open);
                StreamReader sr=new StreamReader(fs);
                string lines;
                while ((lines = sr.ReadLine()) != null) ;
                {
                    //解析每个测试用例
                    //调用待测方法
                    //判断是否通过
                    //记录测试用例结果
                }
                sr.Close();
                fs.Close();
            }

    1.3解析测试用例
    如何解析出由字符分隔开的测试用例的各个字段

    设计:使用string.Split()方法,把分隔符作为输入传给他,然后把返回值存入一个字符数组
    方案:

     while ((lines = sr.ReadLine()) != null) ;
                {
                    //解析每个测试用例
                    tokens = lines.Split(':');
                    caseID = tokens[0];
                    methd = tokens[1];
                    tempInput = tokens[2].Split(' ');
                    expected = tokens[3];
                    ////使用多个分隔符的时候,可以创建包含分隔符的数组,然后把这个数组穿给Split()
                    //char[] separators=new char['#','!',','];
                    //string parts = line.Split(separators);
    
                    //调用待测方法
                    //判断是否通过
                    //记录测试用例结果
                }

    1.4把数据转换为合适的类型

    如何把测试用例的输入数据或者期望结果从string类型转为其他数据类型
    设计:通过选用合适的静态Parese()方法,实施显式类型转换

    int[] input = new int[tempInput.Length];
                    for (int i=0;i<input.Length;i++)
                    {
                        input[i] = int.Parse(tempInput[i]);//Parse()接受一个string作为参数,并且返回调用者所用的数据类型
                    }

    1.5判定测试用例通过与否
    如何判定API测试用例是通过还是失败
    设计:调用待测方法,传给他测试用例的输入,得到返回值。然后比较实际结果与测试用例中读入的期望结果是否一致

    double actual = 0.0;
                    if (method=="ArithmeticMean")
                    {
                        actual = MathLib.Methods.ArithmeticMean(input);
                        if (actual.ToString("F4") == expected)
                        {
                            Console.WriteLine(caseID+"Pass");
                        }
                        else
                        {
                            Console.WriteLine(caseID+"*Fail*"+method+"actual="+actual.ToString("F4")+"expected="+expected);
                        }
                    }
                    else
                    {
                        Console.WriteLine("Method not recognized");
                    }

    测试API方法的时候,必须考虑到待测方法是无状态(stateless)还是有状态的(stateful).大部分API是无状态的(也就是调用之间是相互独立的)

    测试套件必须能访问待测的API方法,大多数情况下把这些API方法的DLL作为工程引用添加到待测程序中;有些情况下,需要把待测方法的代码copy到测试套件

    1.6记录测试结果

    如何把测试用例的结果存入独立于测试程序的简单文本文件

    设计:使用System.IO.StreamWriter对象,把测试用例ID和测试结果写到一个文本文件

    FileStream ofs=new FileStream("..\TestResults.txt",FileMode.CreateNew);//如果存在TestResults.txt,会抛出异常,
                    //可以使用时间戳加在测试结果的文件名称里;还可以使用的策略,将测试结果的文件名作为参数传进来,手动产生新的文件名
                    StreamWriter owr=new StreamWriter(ofs);
                    while ((lines=sr.ReadLine())!=null)
                    {
                        //对lines 进行解析
                        if (method=="ArithmeticMean")
                        {
                            actual = MathLib.Methods.ArithmeticMean(input);
                            if (actual.ToString("F4")==expected)
                            {
                                //同时将结果写入命令行窗口和txt文件
                                Console.WriteLine(caseID+"Pass");
                                owr.WriteLine(caseID+"Pass");
                            }
                            else
                            {
                                owr.WriteLine(caseID+"*Fali*");
                            }
                        }
                        else
                        {
                            owr.WriteLine(caseID+"Unknow method");
                        }
                    }
                    //如果捕获到异常,记得在cath/finally关掉已经打开的输入输出流
                    //catch(Exception ex){console.writeline("Unexpected fatal error"+ex.Message)};owr.Close();
                    owr.Close();
                    ofs.Close();
                }

    1.7给测试用例加上时间戳

    如何给测试用例加上时间戳,以便区分不同批次的运行结果

    设计:把DateTime.Now属性作为参数传给CreateDirectory(),也可以传给FileStream()构造函数

     string stamp = DateTime.Now.ToString("t");
                    stamp = stamp.Replace(":","-");
                    string path1 = "..\TestResluts-" + stamp + ".txt";
                    FileStream ofs1=new FileStream(path1,FileMode.Create);//TestResults-xxx.txt(只有时间);将"t"改成"s"   年-月-日T
                    StreamWriter owr=new StreamWriter(ofs);

    1.8通过计算对测试结果进行总结

    如何计算测试用例的结果以及追踪通过的pass用例和失败用例的个数
    设计:使用简单的整数计数器,每次开始运行测试的时候,测试器初始化为0

                  int numPass = 0, numFail = 0;
                    while ((lines = sr.ReadLine()) != null)
                    {
                        //对lines 进行解析
                        if (method == "ArithmeticMean")
                        {
                            actual = MathLib.Methods.ArithmeticMean(input);
                            if (actual.ToString("F4") == expected)
                            {
                                //同时将结果写入命令行窗口和txt文件
                                //Console.WriteLine(caseID + "Pass");
                                owr.WriteLine(caseID + "Pass");
                                ++numPass;
                            }
                            else
                            {
                                owr.WriteLine(caseID + "*Fali*");
                                ++numFail;
                            }
                        }
                        else
                        {
                            owr.WriteLine(caseID + "Unknow method");
                        }
                    }
                    Console.WriteLine("Number cases passed ="+numPass);
                    Console.WriteLine("Number cases failed ="+numFail);
                    Console.WriteLine("Total cases ="+(numFail+numPass));
                    double percent=((double)numPass)/(numPass+numFail);
                    Console.WriteLine("Percent passed ="+percent.ToString("p"));
  • 相关阅读:
    protobuf(Protocol Buffers)java初体验
    排序(6)---------归并排序(C语言实现)
    JSP/Servlet-----charset 、pageEncoding差别
    [Android] Android开发优化之——对界面UI的优化(2)
    [Android] Android开发优化之——对界面UI的优化(1)
    [Android] Android开发优化之——从代码角度进行优化
    Android开发优化之——对Bitmap的内存优化
    Java 如何有效地避免OOM:善于利用软引用和弱引用
    开源中国源码学习(八)——枚举类
    Android ADB server didn't ACK * failed to start daemon * 简单有效的解决方案
  • 原文地址:https://www.cnblogs.com/cloud-test/p/3517868.html
Copyright © 2020-2023  润新知