参考:https://blog.youkuaiyun.com/uana_777/article/details/80626958 Java 读取Excel表格数据(使用工具:AndroidStudio )
参数化测试实验:
需要测试的类,两个整型数据加减乘除:
//两个int型数据的加减乘除
public class Calculator {
public int add(int a,int b){
return a+b;
}
public int subtract(int a,int b){
return a-b;
}
public int multiply(int a,int b){
return a*b;
}
public int divide(int a,int b){
return a/b;
}
}
简单测试一下加法:
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
public class CalcultorTest {
//获取测试类
private Calculator mCalculator;
@Before
public void setUp(){
mCalculator=new Calculator();
}
//声明测试用例,输入1+2,看结果是不是3
@Test
public void addTwoNumbers(){
int result = mCalculator.add(1,2);
Assert.assertEquals(3,result);
}
}
如果设计了多条输入数据,采用参数化测试:
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import java.util.Arrays;
import java.util.Collection;
/**
* 参数化测试
* 1.需要给测试类做声明,Parameterized.class
* 2.构造函数参数:添加测试用的参数,包含输入和输出(对应输入的期待值)参数
* 3.添加参数集合,最好是:public static collection <Object[]> 集合名(){数组数据},数组参数顺序和构造函数应该一致
* 4.在@Test声明的方法中,调用构造函数参数即可
*/
@RunWith(Parameterized.class)
public class CalculatorParameterizedTest {
//测试类
private Calculator mCalculator;
//测试输入数据
private int ma=0;
private int mb=0;
private int mc=0;
//构造函数将读入的数据赋值给ma,mb,mc
public CalculatorParameterizedTest(int a,int b,int c){
ma=a;
mb=b;
mc=c;
}
//声明输入数据集合,输入数据从集合中调用
@Parameterized.Parameters
public static Collection<Object[]> initData(){
return Arrays.asList(new jxlDemo().ReadDataFromExcel());
}
@Before
public void setUp(){
mCalculator=new Calculator();
}
@Test
public void testAdd_TwoNumbers(){
int resultAdd = mCalculator.add(ma,mb);
System.out.println(" 期待值:"+mc+" 执行结果:"+resultAdd);
Assert.assertEquals(mc,resultAdd);
}
}
关于jxlDemo是参考的资料,读取Excel文档里的数据作为输入,需要用到jxl.jar这个jar包,Excel文档放在新建的assets文件夹:
import java.io.File;
import java.io.IOException;
import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;
public class jxlDemo {
public Object[][] ReadDataFromExcel(){
Workbook book;//Excel文件操作对象
Sheet sheet;//数据表
Cell ma,mb,mc;//表单元
//System.out.println(System.getProperty("user.dir"));
File datafile=new File(System.getProperty("user.dir")+"/src/main/assets/TestData.xls");
try{
//获取要用的Excel文件, 完成数据读取等操作后需要close
book=Workbook.getWorkbook(datafile);
//获取Excel里的第一张表格,第二张就用book.getSheet(1);
sheet=book.getSheet(0);
int rows=sheet.getRows();//第一张表格的行数
int Columns=sheet.getColumns();//第一张表格的列数
//获取表格里的单元数据
//ma=sheet.getCell(0,0);//获取的是第一列的列名
Object[][] object = new Object[rows-1][Columns];
//循环获取每一行的数据,赋值到a、b、c
int i=1;
int a;//a,b,c中间量也可以不用
int b;
int c;
while(i<rows){
ma=sheet.getCell(0,i);//第一列每一行的数据
mb=sheet.getCell(1,i);//第二列每一行的数据
mc=sheet.getCell(2,i);//第三列每一行的数据
a=Integer.parseInt(ma.getContents());//string转int,赋值给a
b=Integer.parseInt(mb.getContents());
c=Integer.parseInt(mc.getContents());
object[i-1][0]=a;//object[i-1][0]=Integer.parseInt(ma.getContents());
object[i-1][1]=b;
object[i-1][2]=c;
i++;
}
book.close();
return object;
}catch(Exception e){
e.printStackTrace();
}
return null;
}
}
截图记录实验数据。结果还是成功的,TestPass,故意改错mc列的期望结果值,也的确会报错。
测试用例多了,就有批量运行的需要。
而关于测试套件,就是整合许多的测试类,让其批量运行。
1.需要声明这是一个套件类,@RunWith(Suite.class)
2.整合加入其他的测试类,@Suite.SuiteClasses({测试类名1,测试类名2,......})
这样已经能右键点击运行了。
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
@RunWith(Suite.class)
@Suite.SuiteClasses({CalcultorTest.class,CalcultorTest2.class})
public class TestSuiteForCalcultor {
}
学习一些网上资料,可以建一个主函数调用,让运行结果Result在控制台输出,。
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;
public class TestRunner {
public static void main(String[] args){
Result result= JUnitCore.runClasses(TestSuiteForCalcultor.class);
for(Failure failure:result.getFailures()){
System.out.println(failure.toString());
}
System.out.println(result.wasSuccessful());
}
}
看到禁用测试除了使用@Ignore以外,还有Assume.assumeFalse或Assume.assumeTrue判断测试条件,
比如:Assume.assumeFalse(条件表达式) 判断条件返回的值,
若为false,则继续执行;
若为true,则抛出异常org.junit.AssumptionViolatedException
@Ignore这类注解也可以标在测试类上,表示类中所有测试方法都不执行。
注解@Test可以也能标注其他参数
@Test(timeout=100)默认时间单位为毫秒,表示用例方法执行若超过100ms,则标注为失败。
@Test(expected=XXXException.class),,表示测试用例应该抛出指定的异常,否则视为失败。
关于类 TestCase和TestResult,是对用例及运行结果的管理?好像现在不用专门继承它们再使用。