您好,欢迎访问三七文档
信息工程学院单元测试被测程序功能•1)输入一个以逗号(或其它字符)分隔的字符串,程序将解析该字符串并得到一个数组。以同样的方式输入第二个字符串,并解析成数组。•2)对输入的字符分隔的每一个值进行判断,必须为数值类型,否则程序将不做任何处理。•3)如果输入合法,将按如下顺序进行判断:•a)如果数组长度为零,将直接输出信息:“结果:数组长度为零.”•b)如果两个数组长度不相等,将直接输出信息:“结果:数组长度不一致.”•c)如果两个数组不经过任何排序,自然相等,输出信息为:“结果:数组相同.”•d)如果两个数组经过排序后比较,是相等的,输出信息为:“结果:数组排序后相同.”•e)如果两个数组经过排序后比较,不相等,输出信息为:“结果:数组不同.”•4)程序不需要专门设计GUI界面,直接使用命令行即可。程序概要设计程序概要设计•1)MainRun:程序运行主入口,用于用户输入数据和调用CompareHandle.mainCompare(1,2).•2)StringHandle:字符串处理类,用于输入数据,解析字符串成数组,判断是否为数值.•3)CompareHandle:程序比较主类,用于比较数组中的值及判断各种可能的情况.•4)ArrayHandle:数组处理类,用于数组排序和数组值的比较.开源测试代码•建一个包:com.learn.test•建一个测试类:StringHandleTest用于测试的代码通常叫做TestFixture使用JUNIT测试•JUnit是针对Java语言的一个单元测试框架,它被认为是迄今为止所开发的最重要的第三方Java库。•JUnit的优点是整个测试过程无需人的参与,无需分析和判断最终测试结果是否正确,而且可以很容易地一次性运行多个测试•JUnit的出现促进了测试的盛行,它使得Java代码更健壮,更可靠,Bug比以前更少。•结合JUnit和JMock两个框架的使用,可以快速开发测试代码,甚至达到TDD所推崇的测试先行的目的,更好地做到敏捷开发,敏捷测试。•使用JUNIT测试•在使用JUnit3的方法规则书写测试用例时,必须满足两个基本要求:•1)测试类必须继承自junit.framework.TestCase类•2)每个测试方法名称必须以test开头,通常我们以test_后面跟上被测方法名称来命名测试方法。•根据JUnit4的规则,我们可以看到如下一些变化:•1)测试类不需要继承TestCase,灵活了很多。•2)测试方法名称不需要以test开头,只需要加上@Test注解指明该方法是JUnit测试方法即可。使用JUNIT测试----------------理解JUnit断言机制•junit.framework.Assert---兼容JUnit3而刻意保留的•org.junit.Assert---JUnit4新增的•assertArrayEquals(Object[]expecteds,Object[]actuals)•用法:比较两个数组是否相同,相同的条件为:长度相同,相同下标的值也相同。•assertTrue(booleancondition)•用法:判断参数是否为布尔“真”,为真则通过,否则失败。•assertEquals(Objectexpected,Objectactual)•用法:判断两个参数值是否相等,支持所有基本数据类型的比较。•P26使用JUNIT测试------理解JUnit各类注解•1)@BeforeClass:测试类运行前准备环境,一个测试类在运行测试方法之前运行一次。•2)@AfterClass:测试类运行后清除环境,一个测试类在运行完所有测试方法后运行一次。•3)@Before:每个测试用例运行前运行,有多少个测试用例,就会运行多少次。•4)@After:每个测试用例运行后运行,有多少个测试用例,就会运行多少次。•5)@Test:具体的测试用例。•6)@Ignore:该测试用例将被忽略。•7)@Rule:定义一些规则,如超时时间,异常捕获等。使用JUNIT测试------理解JUnit各类注解•例子1•@BeforeClass和@AfterClass,其特点为在一个测试类中永远只会被运行一次。•@Before和@After,其特点为每一个测试用例都会运行一次。使用JUNIT测试--理解JUnit各类注解•例子1•@BeforeClass和@AfterClass,其特点为在一个测试类中永远只会被运行一次。•@Before和@After,其特点为每一个测试用例都会运行一次。使用JUNIT测试--理解Junit参数化1、在类外加载参数化生成器•@RunWith(Parameterized.class)//使用参数化运行器2、然后为测试方法添加属性及构造函数(构造函数需要和测试类名相同)3、编写数据初始化的方法•@Parameters//指定该方法为参数生成器•@SuppressWarnings(unchecked)//忽略警告信息publicstaticCollectiongetParamters(){}1/14/2020@RunWith(Parameterized.class)//使用参数化运行器publicclassaddjunit4{publicintx;publicinty;publicintresult;//构造函数publicaddjunit4(intx,inty,intresult){this.x=x;this.y=y;this.result=result;}@Parameters//指定该方法为参数生成器@SuppressWarnings(unchecked)//忽略警告信息publicstaticCollectiongetParamters(){//输入值与结果必须与构造函数定义一一对应Object[][]object={{2,1,1},{2,3,-1},{3,7,-4}};returnArrays.asList(object);}@TestpublicvoidtestAdd(){computecp=newcompute();intcpresult;cpresult=cp.add(this.x,this.y);assertEquals(this.result,cpresult);//fail(Notyetimplemented);}}1/14/2020•isNumber进行参数化改造•splitString进行参数化改造1/14/2020使用JUNIT测试--理解Junit参数化使用JUNIT测试--理解Junit测试集•Suite可以把多个测试类放在一起共同执行•Junit3中的测试集的使用•Junit4中的测试集的使用1/14/2020Junit3中的测试集的使用publicstaticTestsuite(){TestSuitesuite=newTestSuite();//执行测试类TestLargest1中的方法testDupssuite.addTest(newTestLargest1(testDups));//执行测试类TestLargest1中所有的方法//suite.addTestSuite(TestLargest1.class);//执行测试类TestLargest1中指定的测试方法suite.addTest(TestLargest1.suite());returnsuite;}1/14/2020Junit4中的测试集的使用packagecom.learn.testing;importorg.junit.runner.RunWith;importorg.junit.runners.Suite;@RunWith(Suite.class)@Suite.SuiteClasses({StringHandleJUnit4.class,StringHandleParam.class,StringHandleAnnotation.class})publicclassCompareTestSuite{//DoNothing}1/14/2020MOCK对象的使用----理解驱动和桩•Mock对象使用范畴:1)真实对象具有不可确定的行为,产生不可预测的效果,(如:股票行情,天气预报)2)真实对象很难被创建的3)真实对象的某些行为很难被触发4)真实对象实际上还不存在的(和其他开发小组或者和新的硬件打交道)等等...1/14/2020•使用Mock对象测试的关键步骤:1)使用一个接口来描述这个对象2)在产品代码中实现这个接口3)在测试代码中实现这个接口在被测试代码中只是通过接口来引用对象,所以它不知道这个引用的对象是真实对象还是Mock对象。1/14/2020MOCK对象的使用----理解驱动和桩小结•单元测试是测试软件单元的过程,单元测试常常是单元的开发人员负责执行•主要的单元测试活动包括–单元测试计划–设计单元测试用例–搭建单元测试环境–执行单元测试–单元测试报告•单元测试工具非常有帮助•在单元测试中,可以先使用静态分析工具然后使用动态测试工具谢谢!
本文标题:16单元测试
链接地址:https://www.777doc.com/doc-3022045 .html