参考:https://blog.csdn.net/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,是对用例及运行结果的管理?好像现在不用专门继承它们再使用。