Board logo

标题: Predictive Cloud Computing 项目 Maven、单元和集成测试,以及静态代码分析-7 [打印本页]

作者: look_w    时间: 2018-3-31 17:17     标题: Predictive Cloud Computing 项目 Maven、单元和集成测试,以及静态代码分析-7

父测试类使用下一段代码(如清单 13 所述)将数据加载到数据存储中,以便持久性框架访问。该代码指定一个 XML                文件,使用它作为数据库表的转储文件。然后将该表载入一个内存型数据库中,以便快速执行单元测试。
清单                13.数据集加载
1
2
3
4
        @Override
protected Optional<IDataSet> getDataSet() throws DataSetException {
        return Optional.of((IDataSet)new FlatXmlDataSetBuilder().build(Resources.getResource("players.xml")));
}




集成测试的执行与单元测试一样。在 PCC 中,集成测试可能运行更长的时间,可以测试多个组件之间的集成。
在测试复杂系统时,通常需要模拟无法轻松测试的组件。这些组件可能包括网络访问、文件访问,或者其他某种不容易在测试环境中重新创建的资源。模拟是获取这些组件的接口并定义该接口将采取的响应模式的过程。然后将模拟的接口或对象呈现给所测试的对象。测试可以继续运行,而不需要在测试期间可能不可用的资源。Predictive                Cloud Computing 使用了 EasyMock                框架来创建测试模拟对象。下面的代码段演示了一个检查高尔夫球比赛对手的测试模拟对象。所测试的对象需要一个复杂的 site                对象,这通常需要访问数据库。为了方便测试,可以模拟该对象。模拟对象设置包括使用要模拟的类创建一个新模拟对象,然后列出期望的方法调用,以及在调用它们时要返回的结果。然后将此对象传递给日常安排解析器,这样就可以在不访问数据库的情况下测试该模块。
清单                14.模拟对象
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
@Test
public void testParseFile() throws Exception {
         final File file = new File("src/test/resources/mastersreplay/2014/pairings1.json");

         final FileReader reader = new FileReader(file);
         final Reader fixedReader = PairingFileParser.fixJSONFormatting(reader);

         final DateTime nowMidnight = DateTime.now().withMillisOfDay(0);

         final Site site = EasyMock.createMock(Site.class);
         expect(site.getName()).andReturn("masters");
         expect(site.getYear()).andReturn(2013);
         expect(site.getTimezoneOffset()).andStubReturn(0);
         expect(site.getTournamentScheduleStart()).andReturn(nowMidnight).anyTimes();
         replay(site);

         final ImmutableList<PlayerTeeTime> result = PairingFileParser.parseSchedule(fixedReader, site);
         assertEquals(96, result.size());

         final DateTime expectedTime = nowMidnight.withZone(DateTimeZone.forOffsetHours(-4)).withHourOfDay(7).withMinuteOfHour(50);

         assertEquals(expectedTime, result.get(0).getTeeTime());
         assertEquals(expectedTime.getMillis(), result.get(0).getTeeTime().getMillis());
         assertEquals(expectedTime.getMillis(), result.get(1).getTeeTime().getMillis());
         assertEquals(expectedTime.getMillis(), result.get(2).getTeeTime().getMillis());
}




静态分析测试静态分析测试不同于单元测试和集成测试,因为它不会被执行。相反,会检查源代码来查找反模式和其他类型的错误。在帮助维护代码库,验证所交付的代码能够满足团队或行业标准时,静态分析测试很有用。
PCC 项目利用了 SonarQube 来执行静态分析测试。选择 SonarQube                是因为它拥有出色的图形界面,而且能帮助团队识别需要改进的代码区域。
SonarQube 的用户界面是高度可配置的。PCC 配置了 SonarQube 的主页来包含 3                个部分。左上侧部分显示了代码行数、测试覆盖范围和待解决问题的时间线。右侧显示了 PCC                的所有项目的一些简单统计数据,比如代码行数和技术债。技术债是通过修复静态分析检测出的所有缺陷需要花费的大致时间量来衡量的。左下侧描绘了一个热力图,其中每个正方形的大小表示代码行数,色调表示测试覆盖的行数。开发人员可以直观地了解哪些项目需要改进的地方最多。
图 4.SonarQube 用户界面如果从图 5 右侧选择了一个项目,则会为用户提供这个特定项目的静态分析概述。PCC                被配置为显示选定项目的以下细节:技术债、重复率、复杂性随时间的变化、当前复杂性、大小随时间的变化、代码行数,以及单元测试细节。PCC                团队选择了项目页面的每个部分来提供项目状态的有意义洞察。
图 5.SonarQube 项目界面用户界面的技术债部分提供了解决项目中的所有已知问题需要花费的时间量的总体摘要,以及问题总数和每个问题的严重性。红色问题(最顶部的 3                个)的严重性比绿色问题(底部 2 个)要高。
图 6.SonarQube 技术债界面代码重复可能导致代码很难维护。一般而言,如果代码是重复的,那么应该将它提取到一个方法中。如果在整个代码库中复制并粘贴代码,那么代码将很难维护,因为对某个位置的代码的更改在另一个位置很容易被遗忘。这可能导致出错。SonarQube                提供了一个视图,用于快速了解项目中有多少代码是重复的。这个直观视图提供了关于重复性的多个指标:百分比、行数、代码块数,以及包含重复代码的文件数。
图 7.SonarQube 重复界面复杂代码很难理解。在另一位开发人员必须维护一段代码并理解它的功能之前,通常不清楚该代码有多复杂。注释很有帮助,但静态分析有助于衡量代码复杂性,识别哪些代码区域需要改进。为                PCC 配置的代码重复检测可以指出每个类、文件和函数的复杂性。在有大量贡献者的项目中,值得尝试不断减少复杂性指标。
图 8.SonarQube 代码复杂性像复杂性一样,如果某个项目包含太多代码,那么该项目可能很难理解。当项目规模开始增大时,开发人员应考虑将它重构为多个项目。此外,检测可能有助于理解测试覆盖的代码行比例。在                PCC 中,可以通过配置 SonarQube 来显示代码行数、类数量,以及这些类的测试覆盖比例。
图 9.SonarQube 代码大小代码大小随时间变化的视图有助于开发人员了解代码趋势。SonarQube                提供了另一个视图来更详细地展示项目的当前代码大小指标。可以配置代码大小细节视图来显示项目中的代码总行数,以及文件、目录、函数、类、语句和访问器的数量。此信息可显示给开发人员,使其知道项目是否大到难以维护且应分解为多个项目。
图 10.SonarQube 代码大小细节之前已经提到过,对于软件开发,测试是一个非常重要的过程,PCC 也不例外。SonarQube                提供了项目的当前测试状态的直观信息。开发人员能够快速查看单元测试覆盖的代码比例,以及覆盖的代码中的条件比例。开发人员还能通过失败数量、错误列表和测试总耗时等指标,轻松地了解测试成功与否。
图 11.SonarQube 测试覆盖范围和性能




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0