当前位置: 首页 > news >正文

网站排名和什么有关网络推广协议合同范本

网站排名和什么有关,网络推广协议合同范本,wordpress 用户中心主题,我的wordpress网站吗2019独角兽企业重金招聘Python工程师标准 Java单元测试之JUnit4详解 与JUnit3不同#xff0c;JUnit4通过注解的方式来识别测试方法。目前支持的主要注解有#xff1a; BeforeClass 全局只会执行一次#xff0c;而且是第一个运行Before 在测试方法运行之前运行… 2019独角兽企业重金招聘Python工程师标准 Java单元测试之JUnit4详解 与JUnit3不同JUnit4通过注解的方式来识别测试方法。目前支持的主要注解有 BeforeClass 全局只会执行一次而且是第一个运行Before 在测试方法运行之前运行Test  测试方法After  在测试方法运行之后允许AfterClass 全局只会执行一次而且是最后一个运行Ignore 忽略此方法 下面举一个样例 import org.junit.After;   import org.junit.AfterClass;   import org.junit.Assert;   import org.junit.Before;   import org.junit.BeforeClass;   import org.junit.Ignore;   import org.junit.Test;       public class Junit4TestCase {           BeforeClass       public static void setUpBeforeClass() {           System.out.println(Set up before class);       }           Before       public void setUp() throws Exception {           System.out.println(Set up);       }           Test       public void testMathPow() {           System.out.println(Test Math.pow);           Assert.assertEquals(4.0, Math.pow(2.0, 2.0), 0.0);       }           Test       public void testMathMin() {           System.out.println(Test Math.min);           Assert.assertEquals(2.0, Math.min(2.0, 4.0), 0.0);       }               // 期望此方法抛出NullPointerException异常       Test(expected  NullPointerException.class)       public void testException() {           System.out.println(Test exception);           Object obj  null;           obj.toString();       }               // 忽略此测试方法       Ignore       Test       public void testMathMax() {             Assert.fail(没有实现);       }           // 使用“假设”来忽略测试方法       Test       public void testAssume(){           System.out.println(Test assume);                   // 当假设失败时则会停止运行但这并不会意味测试方法失败。           Assume.assumeTrue(false);           Assert.fail(没有实现);       }           After       public void tearDown() throws Exception {           System.out.println(Tear down);       }           AfterClass       public static void tearDownAfterClass() {           System.out.println(Tear down After class);       }       }   单元测试是编写测试代码用来检测特定的、明确的、细颗粒的功能。单元测试并不一定保证程序功能是正确的更不保证整体业务是准备的。 单元测试不仅仅用来保证当前代码的正确性更重要的是用来保证代码修复、改进或重构之后的正确性。 一般来说单元测试任务包括 接口功能测试用来保证接口功能的正确性。局部数据结构测试不常用用来保证接口中的数据结构是正确的 比如变量有无初始值变量是否溢出边界条件测试 变量没有赋值即为NULL变量是数值或字符) 主要边界最小值最大值无穷大对于DOUBLE等溢出边界期望异常或拒绝服务最小值-1最大值1临近边界最小值1最大值-1变量是字符串 引用“字符变量”的边界空字符串对字符串长度应用“数值变量”的边界变量是集合 空集合对集合的大小应用“数值变量”的边界调整次序升序、降序变量有规律 比如对于Math.sqrt给出n^2-1和n^21的边界所有独立执行通路测试保证每一条代码每个分支都经过测试 代码覆盖率 语句覆盖保证每一个语句都执行到了判定覆盖分支覆盖保证每一个分支都执行到条件覆盖保证每一个条件都覆盖到true和false即if、while中的条件语句路径覆盖保证每一个路径都覆盖到相关软件 Cobertura语句覆盖Emma: Eclipse插件Eclemma各条错误处理通路测试保证每一个异常都经过测试 JUNIT JUnit是Java单元测试框架已经在Eclipse中默认安装。目前主流的有JUnit3和JUnit4。JUnit3中测试用例需要继承TestCase类。JUnit4中测试用例无需继承TestCase类只需要使用Test等注解。 Junit3 先看一个Junit3的样例 // 测试java.lang.Math   // 必须继承TestCase   public class Junit3TestCase extends TestCase {       public Junit3TestCase() {           super();       }                // 传入测试用例名称       public Junit3TestCase(String name) {           super(name);       }               // 在每个Test运行之前运行       Override       protected void setUp() throws Exception {           System.out.println(Set up);       }           // 测试方法。           // 方法名称必须以test开头没有参数无返回值是公开的可以抛出异常           // 也即类似public void testXXX() throws Exception {}       public void testMathPow() {           System.out.println(Test Math.pow);           Assert.assertEquals(4.0, Math.pow(2.0, 2.0));       }           public void testMathMin() {           System.out.println(Test Math.min);           Assert.assertEquals(2.0, Math.min(2.0, 4.0));       }               // 在每个Test运行之后运行       Override       protected void tearDown() throws Exception {           System.out.println(Tear down);       }   }     如果采用默认的TestSuite则测试方法必须是public void testXXX() [throws Exception] {}的形式并且不能存在依赖关系因为测试方法的调用顺序是不可预知的。 上例执行后控制台会输出 Set up   Test Math.pow   Tear down   Set up   Test Math.min   Tear down     从中可以猜测到对于每个测试方法调用的形式是 testCase.setUp();   testCase.testXXX();   testCase.tearDown();        运行测试方法 在Eclipse中可以直接在类名或测试方法上右击在弹出的右击菜单中选择Run As - JUnit Test。 在Mvn中可以直接通过mvn test命令运行测试用例。 也可以通过Java方式调用创建一个TestCase实例然后重载runTest()方法在其方法内调用测试方法可以多个。 TestCase test  new Junit3TestCase(mathPow) {           // 重载       protected void runTest() throws Throwable {           testMathPow();       };   };   test.run();     更加便捷地可以在创建TestCase实例时直接传入测试方法名称JUnit会自动调用此测试方法如 TestCase test  new Junit3TestCase(testMathPow);   test.run();     Junit TestSuite TestSuite是测试用例套件能够运行过个测试方法。如果不指定TestSuite会创建一个默认的TestSuite。默认TestSuite会扫描当前内中的所有测试方法然后运行。 如果不想采用默认的TestSuite则可以自定义TestSuite。在TestCase中可以通过静态方法suite()返回自定义的suite。 import junit.framework.Assert;   import junit.framework.Test;   import junit.framework.TestCase;   import junit.framework.TestSuite;       public class Junit3TestCase extends TestCase {           //...       public static Test suite() {           System.out.println(create suite);           TestSuite suite  new TestSuite();           suite.addTest(new Junit3TestCase(testMathPow));           return suite;       }   }     允许上述方法控制台输出 写道 create suite Set up Test Math.pow Tear down   并且只运行了testMathPow测试方法而没有运行testMathMin测试方法。通过显式指定测试方法可以控制测试执行的顺序。 也可以通过Java的方式创建TestSuite然后调用TestCase如   // 先创建TestSuite再添加测试方法   TestSuite testSuite  new TestSuite();   testSuite.addTest(new Junit3TestCase(testMathPow));       // 或者 传入ClassTestSuite会扫描其中的测试方法。   TestSuite testSuite  new TestSuite(Junit3TestCase.class,Junit3TestCase2.class,Junit3TestCase3.class);       // 运行testSuite   TestResult testResult  new TestResult();   testSuite.run(testResult);   testResult中保存了很多测试数据包括运行测试方法数目(runCount)等。 如果细心的话会发现Junit3的package是junit.framework而Junit4是org.junit。 执行此用例后控制台会输出 写道 Set up before class Set up Test Math.pow Tear down Set up Test Math.min Tear down Set up Test exception Tear down Set up Test assume Tear down Tear down After class 可以看到执行次序是BeforeClass - Before - Test - After - Before - Test - After - AfterClass。Ignore会被忽略。 运行测试方法 与Junit3类似可以在Eclipse中运行也可以通过mvn test命令运行。 Assert Junit3和Junit4都提供了一个Assert类虽然package不同但是大致差不多。Assert类中定义了很多静态方法来进行断言。列表如下 assertTrue(String message, boolean condition) 要求condition trueassertFalse(String message, boolean condition) 要求condition falsefail(String message) 必然失败同样要求代码不可达assertEquals(String message, XXX expected,XXX actual) 要求expected.equals(actual)assertArrayEquals(String message, XXX[] expecteds,XXX [] actuals) 要求expected.equalsArray(actual)assertNotNull(String message, Object object) 要求object!nullassertNull(String message, Object object) 要求objectnullassertSame(String message, Object expected, Object actual) 要求expected actualassertNotSame(String message, Object unexpected,Object actual) 要求expected ! actualassertThat(String reason, T actual, Matcher matcher) 要求matcher.matches(actual) true Mock/Stub Mock和Stub是两种测试代码功能的方法。Mock测重于对功能的模拟。Stub测重于对功能的测试重现。比如对于List接口Mock会直接对List进行模拟而Stub会新建一个实现了List的TestList在其中编写测试的代码。 强烈建议优先选择Mock方式因为Mock方式下模拟代码与测试代码放在一起易读性好而且扩展性、灵活性都比Stub好。 比较流行的Mock有 JMockEasyMockMockitopowermock 其中EasyMock和Mockito对于Java接口使用接口代理的方式来模拟对于Java类使用继承的方式来模拟也即会创建一个新的Class类。Mockito支持spy方式可以对实例进行模拟。但它们都不能对静态方法和final类进行模拟powermock通过修改字节码来支持了此功能。 EasyMock IBM上有几篇介绍EasyMock使用方法和原理的文章EasyMock 使用方法与原理剖析使用 EasyMock 更轻松地进行测试。 EasyMock把测试过程分为三步录制、运行测试代码、验证期望。 录制过程大概就是期望method(params)执行times次默认一次返回result可选抛出exception异常可选。 验证期望过程将会检查方法的调用次数。 一个简单的样例是   Test   public void testListInEasyMock() {       List list  EasyMock.createMock(List.class);       // 录制过程           // 期望方法list.set(0,1)执行2次返回null不抛出异常       expect1: EasyMock.expect(list.set(0, 1)).andReturn(null).times(2);       // 期望方法list.set(0,1)执行1次返回null不抛出异常       expect2: EasyMock.expect(list.set(0, 1)).andReturn(1);           // 执行测试代码       EasyMock.replay(list);           // 执行list.set(0,1)匹配expect1期望会返回null       Assert.assertNull(list.set(0, 1));           // 执行list.set(0,1)匹配expect1因为expect1期望执行此方法2次会返回null       Assert.assertNull(list.set(0, 1));           // 执行list.set(0,1)匹配expect2会返回1       Assert.assertEquals(1, list.set(0, 1));           // 验证期望       EasyMock.verify(list);   }       EasyMock还支持严格的检查要求执行的方法次序与期望的完全一致。 Mockito Mockito是Google Code上的一个开源项目Api相对于EasyMock更好友好。与EasyMock不同的是Mockito没有录制过程只需要在“运行测试代码”之前对接口进行Stub也即设置方法的返回值或抛出的异常然后直接运行测试代码运行期间调用Mock的方法会返回预先设置的返回值或抛出异常最后再对测试代码进行验证。可以查看此文章了解两者的不同。 官方提供了很多样例基本上包括了所有功能可以去看看。 这里从官方样例中摘录几个典型的 验证调用行为 import static org.mockito.Mockito.*;       //创建Mock   List mockedList  mock(List.class);       //使用Mock对象   mockedList.add(one);   mockedList.clear();       //验证行为   verify(mockedList).add(one);   verify(mockedList).clear();     对Mock对象进行Stub //也可以Mock具体的类而不仅仅是接口   LinkedList mockedList  mock(LinkedList.class);       //Stub   when(mockedList.get(0)).thenReturn(first); // 设置返回值   when(mockedList.get(1)).thenThrow(new RuntimeException()); // 抛出异常       //第一个会打印 first   System.out.println(mockedList.get(0));       //接下来会抛出runtime异常   System.out.println(mockedList.get(1));       //接下来会打印null,这是因为没有stub get(999)   System.out.println(mockedList.get(999));        // 可以选择性地验证行为比如只关心是否调用过get(0)而不关心是否调用过get(1)   verify(mockedList).get(0);     代码覆盖率 比较流行的工具是Emma和Jacoco,Ecliplse插件有eclemma。eclemma2.0之前采用的是Emma之后采用的是Jacoco。这里主要介绍一下Jacoco。Eclmama由于是Eclipse插件所以非常易用就不多做介绍了。 Jacoco Jacoco可以嵌入到Ant、Maven中也可以使用Java Agent技术监控任意Java程序也可以使用Java Api来定制功能。 Jacoco会监控JVM中的调用生成监控结果默认保存在jacoco.exec文件中然后分析此结果配合源代码生成覆盖率报告。需要注意的是监控和分析这两步必须使用相同的Class文件否则由于Class不同而无法定位到具体的方法导致覆盖率均为0%。 Java Agent嵌入 首先需要下载jacocoagent.jar文件然后在Java程序启动参数后面加上 -javaagent:[yourpath/]jacocoagent.jar[option1][value1],[option2][value2]具体的options可以在此页面找到。默认会在JVM关闭时注意不能是kill -9输出监控结果到jacoco.exec文件中也可以通过socket来实时地输出监控报告可以在Example代码中找到简单实现。 Java Report 可以使用Ant、Mvn或Eclipse来分析jacoco.exec文件也可以通过API来分析。 public void createReport() throws Exception {               // 读取监控结果       final FileInputStream fis  new FileInputStream(new File(jacoco.exec));       final ExecutionDataReader executionDataReader  new ExecutionDataReader(fis);               // 执行数据信息       ExecutionDataStore executionDataStore  new ExecutionDataStore();               // 会话信息       SessionInfoStore sessionInfoStore  new SessionInfoStore();           executionDataReader.setExecutionDataVisitor(executionDataStore);       executionDataReader.setSessionInfoVisitor(sessionInfoStore);           while (executionDataReader.read()) {       }           fis.close();                               // 分析结构               final CoverageBuilder coverageBuilder  new CoverageBuilder();       final Analyzer analyzer  new Analyzer(executionDataStore, coverageBuilder);                   // 传入监控时的Class文件目录注意必须与监控时的一样       File classesDirectory  new File(classes);       analyzer.analyzeAll(classesDirectory);           IBundleCoverage bundleCoverage  coverageBuilder.getBundle(Title);               // 输出报告           File reportDirectory  new File(report); // 报告所在的目录       final HTMLFormatter htmlFormatter  new HTMLFormatter();  // HTML格式       final IReportVisitor visitor  htmlFormatter.createVisitor(new FileMultiReportOutput(reportDirectory));               // 必须先调用visitInfo       visitor.visitInfo(sessionInfoStore.getInfos(), executionDataStore.getContents());       File sourceDirectory  new File(src); // 源代码目录               // 遍历所有的源代码               // 如果不执行此过程则在报告中只能看到方法名但是无法查看具体的覆盖因为没有源代码页面       visitor.visitBundle(bundleCoverage, new DirectorySourceFileLocator(sourceDirectory, utf-8, 4));               // 执行完毕       visitor.visitEnd();   }   转载于:https://my.oschina.net/zhanghaiyang/blog/592971
http://www.zqtcl.cn/news/611321/

相关文章:

  • 湖州房产网站建设南通市城乡和住房建设局网站
  • 郴州建设工程集团招聘信息网站wordpress 橘子皮模板
  • win7搭建网站服务器成都网站建设需多少钱
  • 网站开发一般需要多久菜谱网站模版
  • 基于jsp的电子商务网站开发最好的网站建设公司哪家好
  • 个人网站图片郑州技术支持seo
  • 先做网站还是先做app广州互联网
  • 租用网站的服务器wordpress手机加搜索
  • 做彩票网站怎么样才能让百度收录自己的网站
  • 廊坊网站建设技术托管seo怎么优化关键词排名培训
  • 抛丸机网站怎么做手机网站打不开的解决方法
  • 上海做网站的公司多少钱冷水江网站
  • 百度网站流量查询宣传片制作公司费用
  • 安徽炒股配资网站开发搭建平台载体
  • 中华建设杂志网站记者黑龙江省建设集团有限公司网站首页
  • 成都络迈品牌网站建设网站建设的行业资讯、
  • 英语网站大全免费赤峰市建设厅官方网站
  • 宁波网站建设熊掌号成都网络关键词排名
  • 织梦网站改版需要怎么做平台设计软件
  • 企业展示型网站网站建设设计
  • 增城网站建设服务网站建设制作设计公司佛山
  • 微网站套餐自媒体网站源码模板dede
  • 企业网站改版升级成都便宜网站建设公司
  • 广州公共资源建设工程交易中心网站新塘做网站
  • 数码港 太原网站开发公司iis 建立子网站
  • 做一个自己的网站需要什么商标设计网站猪八戒
  • 傻瓜式网站建设软件保险预约
  • 网站 备案规定自己做简单网站
  • 网站上怎么做支付接口南乐网站建设
  • 咸阳网站建设公司电话做个公司网站大概多少钱