测试

这一部分正在进行中。想要帮助吗?检查必威国际有限公司jenkinsci-docs邮件列表.要了解为Jenkins项目做出贡献的其他方法,请参见必威国际有限公司本页关于参与和贡献

概述

为Jenkins及其插件编写自动化测试对于确保一切按照预必威国际有限公司期工作很重要——在不同的场景中,在多个Java版本中,在不同的操作系统上——同时有助于防止在以后的版本中引入回归。

无论你是在编写一个新的Jenkins插件,还是只是在寻找必威国际有限公司参与Jenkins项目必威国际有限公司,本指南旨在涵盖开始编写各种类型的自动化测试所需的一切。具有编写基于java的测试的基本经验JUnit测试框架假定。

为了使测试更简单,Jenkins附带了必威国际有限公司测试工具,基于JUnit测试框架。这提供了以下特性:

  1. Jenkins安装的自动设置和拆除,允许每个测试方法在干净,孤立的环必威国际有限公司境中运行。

  2. 帮助类和方法可以简化作业、代理、安全领域、SCM实现等的创建。

  3. 声明性注释,指定测试方法将使用的环境;例如,设置必威国际有限公司JENKINS_HOME内容。

  4. 直接访问Jenkins对象模型。必威国际有限公司这允许测试直接断言Jenkins的内部状态。必威国际有限公司

  5. htmlunit.支持,使其简单地测试与Web UI和其他HTTP调用的交互。

配置

依赖关系

必威国际有限公司詹金斯测试工具

默认情况下,您不需要做任何设置必威国际有限公司詹金斯测试工具为您的插件。所有Je必威国际有限公司nkins插件都继承自父POM插件并因此自动包含测试工具依赖项。

类似地,JUnit作为依赖项包含在父POM中,所以不需要将它作为依赖项添加。

覆盖测试线束版本

如果您使用的是版本2.3或更新的父插件POM,您可以通过覆盖必威国际有限公司jenkins-test-harness.version属性,如果您需要更新的功能。例如:

......<属性><必威国际有限公司jenkins-test-harness.version>2.34< 必威国际有限公司/ jenkins-test-harness.version >

使用管道

我们鼓励你测试你的插件是否可以工作管道.您可以在不使插件本身取决于各种管道相关的插件;相反,您可以将这些包含在内测试依赖项,因此它们只在编译和运行测试用例时使用。

这是通过将最低所需的管道插件添加到的< >的依赖关系POM的一部分。下面的列表涵盖了典型的集成测试:

< >的依赖< groupId >org.必威国际有限公司jenkins-ci.plugins.workflow< artifactId >工作流 - 基本步骤<范围>测试< / >范围< / >的依赖< >的依赖< groupId >org.必威国际有限公司jenkins-ci.plugins.workflow< artifactId >workflow-cps<范围>测试< / >范围< / >的依赖< >的依赖< groupId >org.必威国际有限公司jenkins-ci.plugins.workflow< artifactId >workflow-durable-task-step<范围>测试< / >范围< / >的依赖< >的依赖< groupId >org.必威国际有限公司jenkins-ci.plugins.workflow< artifactId >工作流程工作<范围>测试< / >范围< / >的依赖

(您还需要指定<版本>,除非您使用[BOM](https://github.com/必威国际有限公司jenkinsci/bom介绍)。

依赖于其他插件

任何你添必威国际有限公司加到你的POM依赖的Jenkins插件< >范围测试> < /范围将在运行测试用例时创建的Jenkins安装中可用,必威国际有限公司或者在使用运行mvn现病史:

您也可以应用@WithPlugin注释对单独的测试用例,但很少需要。

源代码位置

测试用例的源代码应该放在Maven项目的标准位置,例如src / java /测试/目录中。

例子

查看插件开发的一些工作示例,包括使用必威国际有限公司Jenkinsrule.要在临时Jenkins安装的环境中测试插件代码,请尝试使用一个官方的[原型](必威国际有限公司https://github.com/必威国际有限公司jenkinsci/archetypes#usage.)。

运行测试

从命令行

MVN测试将运行所有测试用例,在命令行上报告进度和结果,并将这些结果写入junit XML文件后模式目标/ surefire-reports /测试——<类名> . xml

来自IDE

大多数Java ide应该能够运行JUnit测试并报告结果。

什么测试

现在我们可以编写一个基本测试,我们应该讨论你应该测试的东西......

TODO:尽可能地对代码进行单元测试。必威国际有限公司jenkinsrule testing:创建使用构建步骤的作业,运行它们,断言输出

共同的模式

本节涵盖了您将在测试用例中经常使用的模式,以及您应该考虑测试的场景。

配置双向测试

对于自由式作业,如果您正在编写一个用户,用户必须通过Web界面配置项目构建器发行商或者相似,测试配置表格正常工作是一个好主意。遵循的过程是:

  1. 启动Jenkins安装必威国际有限公司并以编程方式配置插件。

  2. 通过HtmlUnit在Jenkins中打开相关配置页面。必威国际有限公司

  3. 提交配置页面而不做任何更改。

  4. 验证你的插件仍然是相同的配置。

这可以很容易地用configRoundtrip方便的方法必威国际有限公司Jenkinsrule..使用(原型)(https://github.com/必威国际有限公司jenkinsci/archetypes#usage.)看例子。

提供环境变量

在Je必威国际有限公司nkins中,您可以在Configure System页面上设置环境变量,然后在构建期间可用。要从测试方法重新创建相同的配置,可以执行以下操作:

@规则公共必威国际有限公司JenkinsRule j =必威国际有限公司JenkinsRule ();@Test公共无效someTest() {EnvironmentVariablesNodeProperty prop =EnvironmentVariablesNodeProperty ();env = prop. getenvars ();env.put (DEPLOY_TARGET暂存);j.必威国际有限公司jenkins.getGlobalNodeProperties阀门()(道具);/ /……}

提供测试数据

为了测试插件的某些部分,您可能希望构建工作区中存在某些文件,或者Jenkins以某种方式配置。必威国际有限公司本节介绍使用Jenkins测试工具实现这一目标的各种方法。必威国际有限公司

定制构建工作区

使用虚拟单片机

Freestyle Projects通常在运行构建步骤之前从SCM检查代码,测试线束提供了一些虚拟SCM实现,这使得易于将文件“签出”文件进入工作区。

其中最简单的是SingleFileSCM顾名思义,它在签出期间提供单个文件。例如:

@规则公共必威国际有限公司JenkinsRule j =必威国际有限公司JenkinsRule ();@Test公共无效customizeworkssspacewithfile()抛出异常{//使用虚拟SCM创建一个Freestyle项目FreeStyleProject项目= j.createFreeStyleProject();project.setscm(singlefilescm(greeting.txt你好));/ /……}

一旦这个项目的构建开始,文件greetings.txt与内容你好将被添加到SCM签出阶段的工作空间中。

还有其他的变体SingleFileSCM构造函数,使您可以从字节数组或从资源文件夹或其他文件夹中读取文件来创建文件内容URL源。例如:

进口io.必威国际有限公司jenkins.myplugin.;//读取src/test/resources/io/jenkins/myplugin/test.js必威国际有限公司onproject.setscm(singlefilescm(data.json, .getResource getClass () (test.json)));//读取来自`src / test / compresis / test.json`的内容 - 请注意斜杠前缀project.setscm(singlefilescm(data.json, .getResource getClass () (/test.json.)));

如果您想提供多个文件,您可以使用ExtractResourceSCM,它将将给定ZIP文件的内容提取到Workspace中:

进口io.必威国际有限公司jenkins.myplugin.;//解压src/test/resources/io/jenkins/m必威国际有限公司yplugin/files-and-folders.zip到工作空间project.setscm(ExtractResourceSCM (getClass () .getResource (files-and-folders.zip.)));
在一个管道

管道项目不像Freestyle项目那样有单一SCM的概念,但是提供了多种将文件放置到工作区中的方法。

最简单的是,您可以使用writeFile迈出了管道:基本步骤插件.例如:

@规则公共必威国际有限公司JenkinsRule j =必威国际有限公司JenkinsRule ();@Test公共无效customizeworkspace()抛出异常{//使用给定的(Scripted Pipeline)定义创建一个新的管道workflowjob project = j.createproject(workflowjob.class);Project.SetDefinition(cpsflowdefinition(+节点{+(1)writefile文本:'hello',文件:'greeting.txt'+/ /……+}真正的));/ /……}
1 节点在代理上分配一个工作区,以便我们有地方写入文件。

或者,您可以使用解压缩迈出了管道实用步骤插件将多个文件和文件夹复制到工作区中。

首先,将插件添加到您的POM作为一个测试依赖项-您可以找到groupIdartifactid.价值在插件POM

< >的依赖< groupId >org.必威国际有限公司jenkins-ci.plugins< artifactId >pipeline-utility-steps<版本>1.5.1> < /版本<范围>测试< / >范围< / >的依赖

然后,您可以编写一个测试,从解压该zip文件开始。例如:

进口io.必威国际有限公司jenkins.myplugin.;公共班级PipelineWorkspaceExampleTest{@规则公共必威国际有限公司JenkinsRule j =必威国际有限公司JenkinsRule ();@Test公共无效customizeworkspacefromzip()抛出异常{//从src/test/resources/io/jenkins/myplugin/files-and-folders.zip获取zi必威国际有限公司p文件的引用URLzipFile = getClass () .getResource (files-and-folders.zip.);//使用给定的(Scripted Pipeline)定义创建一个新的管道workflowjob project = j.createproject(workflowjob.class);Project.SetDefinition(cpsflowdefinition(+节点{+(1)解压缩'+ + zipFile.getPath ()'+(1)/ /……+}真正的));/ /……}}
1 zip文件的路径是动态的,因此我们将其传递到流水线定义中。
使用FilePath

待办事项:展开本节,并解释下面的示例。

filepath workspace = j.必威国际有限公司jenkins.getworkspacefor(作业);filepath报告= workspace.child(目标)。孩子(lint-results.xml);report.copyFrom (getClass () .getResourceAsStream (lint-excuest_r20.xml.));

自定义必威国际有限公司JENKINS_HOME目录

待办事项:写这一部分。

使用@localdata.

待办事项:正确地写这部分。

使用本地测试方法或测试类运行一个测试用例。

此配方允许您的测试用例从测试方法或从测试类开始加载预设的Hudson_home数据。例如,如果测试方法是org.acme.footest.bar(),则可以在资源文件夹中的以下位置之一(通常是SRC /测试/资源)中的测试数据中:

  • 在ORG / ACME /脚/栏目录下(即,您将拥有ORG / ACME / SOOTEST / BAR / CONFIC.XML),与真实JENKINS_HOME目录相同的布局。必威国际有限公司

  • 在org/acme/FooTest/bar.zip中作为zip文件。

  • 在org/acme/FooTest目录下(也就是说,您将拥有org/acme/FooTest/config.xml),其布局与真正的JENKINS_HOME目录相同。必威国际有限公司

  • 在org/acme/FooTest.zip中作为zip文件。

搜索按照这个特定的顺序执行。通过将数据集与测试类关联起来,或者让数据集在特定测试方法的本地,回退机制允许您编写一个与相同数据集的不同方面交互的测试类。zip和目录的选择取决于测试数据的性质以及数据的大小。

配置SCM.

待办事项:写这一部分。您可以在测试期间使用@gitsamplereporule.

使用代理人

待办事项:制造假代理。

启用安全性

待办事项:创建虚假的安全领域。使用LocalData预设。

验证日志

您可以使用验证日志消息@LoggerRule.这对于在交互测试期间临时启用某些日志记录器也很有用。例如:

进口java.util.logging.Level;进口org.junit.Rule;进口org.junit.test.test.;进口org.jvnet.hudson.test.LoggerRule;进口静止的org.hamcrest.Matchers.containsString;进口静止的org.junit.Assert.assertThat;进口静止的org.jvnet.hudson.test.LoggerRule.Recorded.;公共班级MyTest{公共@规则LoggerRule l =loggerrule();@Test公共无效testlogs()抛出异常{l.capture (3.)。记录(my.logger.name水平。全部);dothingthatlogs();assertthat(l,记录(水平信息、containsString (事情成功开始了)));}}

进一步的管道测试

测试耐用的管道步骤

待办事项:RestartableJ必威国际有限公司enkinsRule。

进一步的模式

自定义建设者

先进和提示等

参考文献