.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[];
methd = tokens[];
tempInput = tokens[].Split(' ');
expected = tokens[];
////使用多个分隔符的时候,可以创建包含分隔符的数组,然后把这个数组穿给Split()
//char[] separators=new char['#','!',','];
//string parts = line.Split(separators); //调用待测方法
//判断是否通过
//记录测试用例结果
}

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

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

int[] input = new int[tempInput.Length];
for (int i=;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 = , numFail = ;
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"));

.net软件自动化测试笔记(API-1)的更多相关文章

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

    1.9获得测试运行时间如何获得测试运行的总时间设计:DateTime.Now属性记录测试开始运行时间,以及测试结束时间,用一个TimeSpan对象计算本次运行的总时间 DateTime starTim ...

  2. 《软件自动化测试开发-Java和Python测试开发实用指南》出版了

    1.关于书中下载链接的问题:出现404,页面不存在 解答:大小写要区分,l和1不能弄错了 2.关于勘误,出现极个别漏子少字错字 解答:后续版本会改进,目前能理解就好了 ---------------- ...

  3. Atitit Atitit.软件兼容性原理----------API兼容 Qa7

    Atitit Atitit.软件兼容性原理----------API兼容 Qa7 1. 兼容性的重要性与反面教材1 2. 提升兼容性的原则2 2.1. What 与how 分离2 2.2. 老人老办法 ...

  4. 基于ruby的watir自动化测试 笔记二

    基于ruby的watir自动化测试 笔记一的补充版,新增加了些特殊的控件捕获方法.还在更新中.... attribute_value 获取当前控件的属性 Value = ie.link(:id=> ...

  5. 篇4 安卓app自动化测试-Appium API进阶

    篇4                 安卓app自动化测试-Appium API进阶 --lamecho辣么丑 1.1概要 大家好! 我是lamecho(辣么丑),今天是<安卓app自动化测试& ...

  6. 用selenium工具做软件自动化测试的面试题及答案

    1.selenium中如何判断元素是否存在? 答:isElementPresent 2.selenium中hidden或者是display = none的元素是否可以定位到? 答:不可以定位到 3.s ...

  7. Vue学习笔记-API调试工具--->国产apipost按装(比postman好按装好用)

    一  使用环境: windows 7 64位操作系统 二   Vue学习笔记-API调试工具--->apipost按装 1.下载: https://www.apipost.cn/ (比postm ...

  8. VectorCAST软件自动化测试方案

    VectorCAST 是主要用于对C/C++/Ada程序进行软件自动化测试,并能够在Windows和Linux等多种开发环境下运行.其主要功能包含自动化的单元测试.集 成测试.覆盖率分析.回归测试.代 ...

  9. 使用Wisdom RESTClient自动化测试REST API,如何取消对返回的body内容的校验?

    使用Wisdom RESTClient V1.1 自动化测试API,默认是对返回HTTP状态码和body内容进行校验的. 如果您的API返回body内容是变化的,可以通过设置来取消对body内容的校验 ...

随机推荐

  1. Less使用——让老司机带你飞

    为什么我要使用Less less的作为编写css的工具插件,省时.方便.检测,具体的安装,请参考我的一篇文章<sublime text3 个人使用心得>,里面我讲解了安装方法,使用webs ...

  2. 当linux遇上多网卡时

    我虚拟机有三个网卡,有两个在用,分别是不同的网段 eth4: 192.168.100.6/24 eth6: 192.168.137.131/24 但是默认系统把我的内部网络eth6设置为所有ip地址需 ...

  3. MySQL字符串类型转换时间类型

    如果MySQL数据库里面的某个时间用的是varchar(或者是char)类型的,这样可以方便系统使用而不用随便转换时间类型来适应数据库版本的不同,当要把取出的字段转换成时间类型的时候,可以按如下方法操 ...

  4. php eval函数用法总结

    可以在php.ini禁止此函数,结果失败了 eval定义和用法  eval() 函数把字符串按照 PHP 代码来计算.  该字符串必须是合法的 PHP 代码,且必须以分号结尾.  如果没有在代码字符串 ...

  5. mysql(转)

    /* 启动MySQL */net start mysql /* 连接与断开服务器 */mysql -h 地址 -P 端口 -u 用户名 -p 密码 /* 跳过权限验证登录MySQL */mysqld ...

  6. chmod,chown和chgrp的区别

    1.chgrp(转变文件所属用户组)change group chgrp 用户组 文件名 ###便是这个格了.若是整个目次下的都改,则加-R参数用于递归. 如:chgrp -R user smb.co ...

  7. java常见内存溢出(OOM)

    jvm内存区域 程序计数器一块很小的内存空间,作用是当前线程所执行的字节码的行号指示器. java栈与程序计数器一样,java栈(虚拟机栈)也是线程私有的,其生命周期与线程相同.通常存放基本数据类型, ...

  8. location.hash 详解

    前年9月twitter改版. 一个显著变化,就是URL加入了"#!"符号.比如,改版前的用户主页网址为 http://twitter.com/username 改版后,就变成了 h ...

  9. StatsD!次世代系统监控的核心

    在互联网业务蒸蒸日上的今时今日,系统架构日渐复杂,随着软件产品和工程团队的变革,许多开源的监控工具应运而生,其中有一些相当出名,比如 Zabbix.Nagios 还有 StatsD.也有一些问题被大家 ...

  10. FZU 2140 Forever 0.5

     Problem 2140 Forever 0.5 Accept: 36    Submit: 113    Special JudgeTime Limit: 1000 mSec    Memory ...