system: [SYSTEM]

user: 3. 设计与实现 3.1. 车型认证系统简介 现阶段我国汽车产品型式认证呈现多头管理的状态，形成了由国家发展和改革委员会、国家工业和信息化部、国家质量监督检验检疫总局及其所属国家认证认可监督管理委员会和国家环境保护部四大政府机构共同承担管理职能的局面，同时公安部、商务部、财政部、海关总署、交通和运输部等也涉及汽车行业相关环节的管理。这种监管模式造成针对个别参数企业要进行多次填报和审批。 对于企业而言，为了应对多头管理的认证工作现状，企业需要同时应对不同认证项目，在相关的认证平台上进行数据的填报，由于行业内暂无统一申报平台，而每个项目都有大量的数据需要进行填报。为了应对这样的情况，企业通常需要组织大量的人员进行型式认证工作，且在这个过程中很容易造成企业内部管理成本与人工成本的提高，以及管理的混乱。为了帮助企业改变通过人工手段应对型式认证多头管理的被动局面，在企业建立统一的型式认证平台。 车型认证系统帮组企业解决了多次填报、审批参数的问题，实现CCC、北环、国环等认证工作的自动填报，全面提高企业型式认证工作能力。但是对于车型认证系统的测试验证工作中，面对大量参数的反复申报，人工测试显然低效、枯燥、乏味的。根据大数据量，反复使用的特点，中国汽车技术研究中心·数据中心引入Selenium2.0测试套件。 3.2. Selenium简介 Selenium是2004年ThoughtWorks公司的Jason Huggins专门设计开发的自动化测试工具套件，目的是实现多平台Web应用程序测试 [ 5 ] 。它经历了两个版本，Selenium 1.0和Selenium 2.0。Selenium不是由单独一个工具构成的，而是由一些插件、类库组成，每个部分都有其特点和应用场景，主要用于Web应用程序的自动化测试，并支持所有基于Web的管理任务自动化，具有开源、多浏览器支持、多平台支持、多语言支持及简单灵活等特点。Selenium 1.0由一些插件、类库组成，主要包括Selenium IDE、Selenium Grid和Selenium RC等，Selenium 1.0家谱，如下图1所示： Selenium 1.0版本与WebDriver结合发展为当前的Selenium 2.0版本，为用户提供了最优秀的测试框架并被广泛应用。本文主要讨论的是Selenium 2.0在汽车软件平台的应用。 图1. Selenium 1.0家谱 3.3. Selenium 2.0 Selenium 2.0支持WebDriver API及其底层技术，同时在基于WebDriver API基础上，通过Selenium 1.0技术对测试代码的移植，提供了极大的便利。此外，为了向后兼容Selenium 2.0仍然使用Selenium 1.0的Selenium RC接口。 WebDriver是通过原生浏览器支持或者浏览器扩展来直接控制浏览器。WebDriver针对各个浏览器而开发，取代了嵌入到被测Web应用中的JavaScript。与浏览器的紧密集成，使其支持创建更高级的测试，避免了JavaScript安全模型导致的限制。除了来自浏览器厂商的支持之外，WebDriver还利用操作系统级的调用，模拟用户输入。 Selenium与WebDriver早先属于两个不同的项目，WebDriver的创建者Simon Stewart早在2009年8月的一份邮件中解释了项目合并的原因。主要原因是WebDriver解决了Selenium存在的缺点，例如能够绕过JavaScript沙箱；还有部分原因是Selenium解决了WebDriver存在的一些问题，例如对多浏览器的兼容等。 3.4. TestNG TestNG是一个测试框架，主要是根据JUnit和NUnit的思想而构建的，利用了注释来强化测试功能，它既可以用来做单元测试，也可以用来做集成测试 [ 6 ] 。TestNG与Selenium结合使用，可以实现其他测试框架无法实现的功能，如使用依赖项进行测试，重新运行失败了的测试，以及使用单独文件中定义的参数进行参数化测试。上述特性使其在众多Web应用程序测试框架中脱颖而出。 在测试自动化中，测试代码不仅包含测试逻辑，还包含许多其他代码，如URL拼接、Html/xml解析、访问UI控件等。若把测试逻辑与这些无关的代码混在一起，测试逻辑将很难理解，也不容易维护。TestNG采用分层结构很好地解决了这一问题，分层的测试框架如图2所示。 3.5. 框架设计 在机动车型式认证管理系统自动化测试平台中，测试框架如图3所示，包括构建层、执行层和展示 图2. 测试框架图 图3. 代码框架实现图 层三部分。各个框架及工具所实现的功能分别为：① 构建层是对开源Selenium 2.0封装开发，实现对于WebBrowser的控制功能；② 控制层集成TestNG，根据测试用例执行数据驱动测试，实现测试执行逻辑的控制，通过扩展实现测试失败跳出执行、截图等策略；③ 展示层通过开源的Selenium插件展示测试结果，对其进行修改定制，以满足结果展示需求；④ 测试用例采用Excel文件维护。 3.6. 代码框架实现 在代码框架实现中，首先创建基类。目的是为了使框架中所有的基本操作都从基类中去调用，实现统一性，同时，由于测试平台多样，对应的浏览器又不同，通过创建的基类能够解决测试平台和测试浏览器选择的问题。其次，对页面元素的操作单独抽象出来，通过页面对象模型(Page Object)实现操作的统一管理。不仅使测试脚本有更高的可维护性，减少了重复的代码，而且帮助缓存远程，避免出现元素过期的问题。此外，对工具包进行了封装，封装了Selenium的API、读取数据类等。图3为代码框架实现图的具体内容。 在测试框架代码结构中，根据不同功能设置了base、pages、plugins、testcases及utils等多个子目录(子包)，各子包具体功能介绍如下。 ① base：存放基类，做预处理和释放资源的职能。 ② pages：存放页面元素类，根据PO模型统一管理对应页面的所有元素。 ③ plugins：主要存放的是第三方插件。 ④ testcases：用于存放测试用例，如登录模块，首页模块等。 ⑤ utils：封装了各种工具类，包括读取excel、Selenium api封装类，读取数据库类，读取属性文件类和选择浏览器类等。 此外，项目编译生成的class文件存放在bin目录中。框架类所需的所有属性文件存储在config目录中。各模块需要用到的测试数据以Excel文件形式存放在data目录下，每个模块对应一个Excel文件，每个sheet对应一个测试用例。框架的说明文档、编码规范等一些项目文档存放于doc目录。chromediver和iedriver等驱动程序存放在res目录中。测试框架运行测试用例生成的报告(包含log，截图等)存储在result目录下。 3.7. 测试结果 机动车型式认证管理系统对法规认证涉及的车型认证2600多项参数，进行收集、审批、变更和上报；根据48家车企、16种车型的要求，对约计200万条数据进行多次迭代测试。应用基于selenium自动化的测试解决方案后，有效地提高了测试人员对产品质量的测试效率，降低了功能测试的时间成本与测试报告分析成本，表1是实验数据抽样统计结果。 在自动化测试实施前，对手工测试和自动化测试的时间成本进行推演，发现手工测试在用例设计阶段的成本要小于自动化测试的成本，但在单次用例执行阶段，自动化测试要明显少于手工测试时间。手工测试与自动化测试的时间成本推演结果见表2。 测试结果的展现通过开发插件实现，该插件基于TestNG进行开发，既可以用在基于TestNG的自动化测试框架中，也可以收集测试结果并存储在Excel中，进而直观的了解到项目各个模块用例的执行条数、结果、通过率及耗时。通过各个模块的详细日志和截图可以精准快速的定位问题所在。 汇总页效果如图4所示，其中，模块中的蓝色字体可以点击，点击之后可以跳转到对应的模块中，汇总页面中的所有输出都是程序自动计算的结果，无需人工进行任何操作。 通过测试报告的结果展示，可以发现所有的测试用例均已被覆盖到，但是失败情况还需要人工进行校验判断，这是以后要持续研究改进的地方。