空手道:测试自动化变得简单

2020-08-16 18:39:41

空手道是唯一一款将API测试自动化、模拟、性能测试甚至UI自动化整合到单一的统一框架中的开源工具。由Cucumber推广的BDD语法是语言中立的,即使是非程序员也很容易。强大的JSON&;XML断言是内置的,您可以并行运行测试以提高速度。

测试执行和报告生成感觉就像任何标准的Java项目。但是,对于不熟悉Java的团队来说,也有一个独立的可执行文件。您不必编译代码。只需以简单、可读的语法编写测试-精心为HTTP、JSON、GraphQL和XML设计。您可以在同一个测试脚本中混合使用API和UI测试自动化。

如果您熟悉黄瓜/小黄瓜,这里最大的区别在于您不需要编写额外的胶水代码或Java步骤定义!

值得指出的是,JSON是语法的头等公民,这样您就可以表达有效负载和预期数据,而不必使用双引号,也不必用引号将JSON字段名括起来。没有必要像在Java或其他编程语言中那样对字符进行转义。

而且您不需要为您需要使用的任何有效负载创建额外的Java类。

脚本是纯文本的,不需要编译步骤或IDE,团队可以使用Git/标准SCM进行协作。

基于流行的黄瓜/小黄瓜标准-具有IDE支持和语法颜色选项。

不再需要Java Beans或助手代码来表示有效负载和HTTP端点,并极大地减少了测试所需的代码行

由于空手道内置的文本操作和JsonPath功能,非常适合测试来自GraphQL API的高度动态响应。

测试具有超强的可读性-因为场景数据可以内联、以人类友好的JSON、XML、Cucumber场景大纲表或空手道特有的有效负载构建器方法表示。

将预期结果表示为可读的、格式良好的JSON或XML,并在单个步骤中断言整个响应有效负载(无论多么复杂或嵌套得多深)与预期的一样。

全面的断言功能-故障清晰地报告哪些数据元素(和路径)没有达到预期,即使是大型有效负载也可以轻松排除故障。

功能齐全的调试器,可以后退,甚至可以在编辑步骤时重放一步-大大节省了时间。

JSON更简单、功能更强大的替代方案-验证有效负载结构和格式的模式-甚至支持跨域/域验证逻辑。

脚本可以调用其他脚本-这意味着您可以轻松地重用和维护身份验证,并且可以跨多个测试高效地设置流。

嵌入式JavaScript引擎,允许您构建适合您的特定环境或组织的可重用函数库

跨测试重用有效负载数据和用户定义函数是如此容易,以至于这成为测试开发人员的一种自然习惯。

内置了对数据驱动测试的支持,并且能够对测试进行标记或分组,不需要依赖外部框架。

本机支持读取YAML甚至CSV文件-您可以将其用于数据驱动测试。

标准的Java/Maven项目结构,无缝集成到CI/CD管道中-并支持JUnit5。

可作为轻量级独立可执行文件使用-方便不熟悉Java的团队。

与Cucumber兼容的内置测试报告,因此您可以选择使用第三方(开源)maven-plugins生成更好看的报告。

如果需要,可以轻松调用JDK类、Java库或重用自定义Java代码,以实现最终的可扩展性。

用于身份验证和HTTP标头管理的简单插件系统,可处理任何复杂的真实场景

面向未来的可插拔HTTP客户端抽象同时支持Apache和Jersey,因此您可以选择最适合您的项目,而不会因库或依赖项冲突而受阻。

跨浏览器Web UI自动化,以便您可以使用相同的框架测试应用程序的所有层。

跨平台桌面自动化(试验性),可根据需要混合到Web自动化流中。

通过Java API调用的选项,这意味着您可以很容易地将空手道混合到Java项目或遗留的UI自动化套件中。

通过重新使用空手道测试套件作为加特林性能测试来节省大量工作,这些测试深入地断言服务器响应在负载下是准确的。

Gatling集成可以与任何自定义Java代码挂钩-这意味着您甚至可以对非HTTP协议(如GRPC)进行性能测试。

内置分布式测试功能,可用于API、UI甚至负载测试,无需任何复杂的网格基础设施。

API模拟或双重测试,甚至可以在多个调用中保持CRUD状态-支持微服务和消费者驱动合同的TDD

异步支持,允许您无缝集成自定义事件的处理或侦听消息队列。

模拟HTTP servlet,使您能够测试任何控制器servlet,如Spring Boot/MVC或Jersey/JAX-RS,而不必引导应用服务器,并且您可以原封不动地使用HTTP集成测试。

对于熟悉或目前使用REST-ASSERED的团队,空手道与REST-ASSERED的详细比较可以帮助您评估空手道。

具有空手道的マイクロサービスにおけるテスト自動化-(使用空手道的微服务测试自动化)演示文稿,铃木隆则。

使用空手道测试Web服务-安德鲁·奈特在Automation Panda博客上提供的快速入门指南和评论。

你可以在维基上找到更多的参考资料。空手道也有自己的标签,在Stack Overflow有一个非常活跃和支持的社区。

如果您是Java开发人员-空手道需要Java8(至少1.8.0_112或更高版本),然后安装Maven、Gradle、Eclipse或IntelliJ。请注意,空手道在OpenJDK上运行良好。支持8-12的任何Java版本。

如果您是编程或测试自动化的新手,请参考此视频了解IntelliJ社区版(免费)入门。其他选项是快速入门或独立可执行文件。

如果您不想使用Java,您可以选择只下载并解压缩ZIP发行版。尤其是如果你在编程或测试自动化方面没有太多经验的话,试试吧。我们建议您使用Visual Studio代码的空手道扩展-这样,JavaScript、.NET和Python程序员就会有宾至如归的感觉。

Visual Studio代码也可以用于Java(或Maven)项目。使用它的一个原因是我们对空手道有出色的调试支持。

空手道的设计使您可以在Apache或Jersey HTTP客户端实现之间进行选择。

如果遇到类加载冲突,例如,如果项目中正在使用较旧版本的Apache库,则使用空手道-Jersey而不是空手道-Apache。

使用空手道Maven原型通过一个命令创建骨架项目可能会更容易。然后,您可以跳过接下来的几个部分,因为将为您创建pom.xml、推荐的目录结构、示例测试和JUnit5运行器。

如果您位于公司代理之后,或者特别是如果您的本地Maven安装已配置为指向本地网络中的存储库,则以下命令可能不起作用。一种解决方法是暂时禁用或重命名Maven settings.xml文件,然后重试。

有关免费IntelliJ社区版的入门信息,请参阅此视频。它简化了上述过程,因为您只需要安装IntelliJ。对于Eclipse,请参阅IDE支持上的wiki。

空手道测试脚本的文件扩展名为.feature,这是Cucumber遵循的标准。您可以使用常规的Java包约定自由地组织文件。

Maven的传统是将非Java源文件放在单独的src/test/resources文件夹结构中-但我们建议您将它们与*.java文件并排保存。当您有一个大型而复杂的项目时,您最终也会得到几个数据文件(例如*.js、*.json、*.txt),并且在同一位置查看*.java和*.Feature文件以及所有相关工件要方便得多。

这在Maven用户中非常常见,请记住这些是测试,而不是生产代码。

有了上面的内容,您就不必一直在src/test/java和src/test/resources文件夹之间切换,您可以将所有测试代码和工件放在src/test/java下,一切都将按预期进行。

一旦您习惯了这一点,您甚至可能会开始疑惑为什么项目需要src/test/resources文件夹!

Soumendra Daas创造了一个很好的例子和指南,你可以在这里作为参考:Hello-空手道。这演示了为测试Spring Boot应用程序而设置的Java Maven+JUnit4项目。

因为这些是测试,而不是生产Java代码,所以您不需要受com.mycompany.foo.bar约定以及随之而来的不必要的子文件夹爆炸的约束。我们建议您的文件夹层次结构只有一到两层深-其中文件夹名称清楚地标识哪些资源、实体或API是测试中的Web服务。

Src/test/java|+--karate-config.js+--logback-test.xml+--ome-reusable.feature+--ome-classpath-function.js+--ome-classpath-payload.json|\--AnimalsTest.java|+--cat|+--cat-post.feature|+--cat-get.feature|+--cat.json|\--Cat.Feature|+--cat.json|\--Cat.json|\--CatalsTest.java|。Json+--ome-helper-function.js\--DogsRunner.java。

假设您使用JUnit,上面所示的推荐(最佳实践)命名约定和文件位置选择有一些很好的理由:

不将*Test.java约定用于cat and dog文件夹中的JUnit类(例如CatsRunner.java),可确保从命令行调用MVN test(针对整个项目)时不会拾取这些测试。但是您仍然可以从IDE调用这些测试,这在开发模式下很方便。

Java(唯一遵循*Test.java命名约定的文件)充当整个项目的测试套件。默认情况下,空手道也会从子目录加载所有*.Feature文件。但是,由于在文件夹层次结构中,某些-reusable.feature位于AnimalsTest.java之上,因此它不会被提取。这正是我们想要的,因为某些-reusable.feature被设计为只能从其他测试脚本中调用(可能会传递一些参数)。您还可以使用标签跳过文件。

一些-classpath-function.js和一些-classpath-payload.json位于JAVA类路径的根目录中,这意味着可以通过使用前缀classpath:从任何测试脚本轻松读取(和重用)它们,例如:read(';classpath:some-classpath-function.js';).。相对路径也会起作用。

有关脚本或*.Feature文件中实际包含的内容的详细信息,请参阅语法指南。

在某些情况下,对于大型有效负载,特别是当默认系统编码不是UTF-8(Windows或非美国区域设置)时,您可能会遇到遇到java.io.ByteArrayInputStream而不是字符串的问题。其他错误可能是java.net.URISyntaxException和Match因特殊字符或外国字符(例如德语或ISO-8859-15)而无法按预期工作。典型的症状是您的测试通过IDE运行得很好,但在通过Maven或Gradle运行时就不行了。解决方案是确保在运行空手道测试时,将JVM file.coding设置为UTF-8。这可以通过maven-surefire-plugin配置来完成。将插件添加到pom.xml的<;build>;/<;plugins>;部分(如果不存在):

如果希望使用JUnit4,请使用空手道-juit4Maven依赖项,而不是空手道-juit5。

要从Java IDE运行script*.Feature文件,您只需要在同一个包中包含以下空测试类。类的名称无关紧要,它将自动运行同一软件包中的任何*.Feature文件。这很有用,因为根据您组织文件和文件夹的方式,您可以让单个JUnit测试类执行多个功能文件。

有关如何运行JUnit类的信息,请参阅IDE文档。通常,在项目浏览器中甚至在编辑器视图中右键单击该文件都会调出“Run as JUnit Test”菜单选项。

空手道将遍历子目录并查找*.Feature文件。例如,如果com.mycompany包中有JUnit类,也会运行com.mycompany.foo和com.mycompany.bar中的*.Feature文件。如上所述,这是您可能更喜欢平面目录结构的原因之一。

空手道支持JUnit5,其优点是在一个测试类中可以有多个方法。只需要1次导入,而不是使用类级注释,而是使用一个简洁而流畅的API来表达您想要使用的测试和标记。

请注意,Java类不需要是公共的,甚至测试方法也不需要是公共的-因此测试最终非常简洁。

套餐空手道;导入com.tuit.karate.juit5.Karate;class SampleTest{@空手道。测试空手道testSample(){return空手道.run(";sample";).relativeTo(getclass());}@空手道。测试空手道testTags(){返回空手道.run(";tag";).tag(";@Second";).relativeTo(getclass());}@空手道。测试空手道testFullPath(){返回空手道.run(";classpath:空手道/tags.feature";).tag(";@first";);}}。

您应该能够右键单击并使用IDE运行单个方法-当您处于开发模式时,这应该就足够了。但是,为了能够从命令行运行JUnit 5测试,您需要确保项目pom.xml中存在最新版本的maven-surefire-plugin(在<;build>;/<;plugins>;部分中):

要运行单个测试方法(例如上例中的testTags()),可以执行以下操作:

当您使用JUnit运行器时-在执行每个特性之后,一个HTML报告将输出到target/surefire-report文件夹,并且完整路径将打印到控制台(参见视频)。

您可以轻松地选择(双击)、复制此文件:URL并将其粘贴到您的浏览器地址栏中。此报告对于排除测试故障和调试测试非常有用,因为所有请求和响应都与这些步骤以及错误消息和打印语句的输出一起显示。如果您重新运行测试,只需刷新浏览器窗口即可。

即使在同一文件夹(或子文件夹)中有多个*.Feature文件,要仅运行JUnit4测试中的特定功能文件,请使用@KarateOptions注释。

如果希望使用JUnit4,请使用空手道-juit4Maven依赖项,而不是空手道-juit5。JUnit5支持不需要类级注释来指定要使用的特性和标记。

注释中的Feature参数可以接受一个数组,因此,如果您希望将多个功能文件与JUnit 4测试相关联,您可以这样做:

您甚至可以指向一个目录(或包)。将其与标记结合使用以执行多个功能,而不必列出每个功能。

@KarateOptions(FEATURES=";CLASSPATH:MOTERS/CATES&34;,TAG=";~@IGNORE";)//这将运行';MOTIES/CATES';//中除标记为@IGNORE的功能文件之外的所有功能文件。

通常在开发模式下,您将使用IDE直接或通过附带的Runner';JUnit Java类运行*.Feature文件。当您有一个合适的Runner类时,也可以从命令行运行它。

请注意,默认情况下,MVN test命令只运行遵循*Test.java命名约定的测试类。但是您可以选择一个测试来运行,如下所示:

当您的Java test&34;runner;链接到多个功能文件时(当您使用推荐的并行运行程序时就是这种情况),您可以通过命令行将范围缩小到单个功能(甚至目录),这在dev-mode中很有用。请注意如何使用空手道选项指定要排除(或包括)的偶数标签。

可以指定多个要素文件(或路径),不受空格字符的限制。他们应该在空手道的尽头。选项。

对于Gradle,您必须扩展测试任务以允许将空手道.options传递给运行时(否则它们将被Gradle本身使用)。要执行此操作,请添加以下内容:

测试{//将空手道选项拉入运行时系统Property";Karate.options";,System.properties.getProperty(";karate.options";)//将空手道环境拉入运行时系统Property";karate.env";,System.properties.getProperty(";karate.env";)//确保始终运行测试输出。upToDateWhen{False}}。

推荐使用空手道定义和运行测试套件和报告的方法是使用并行运行器,下一节将介绍这一点。本节中的方法更适合于使用IDE在dev模式下进行故障排除。

在空手道中定义测试套件的一种方法是让JUnit类位于项目中所有*.Feature文件之上的级别(根据文件夹层次结构)。因此,如果您采用前面的文件夹结构示例,则可以在命令行上执行此操作:

这里,AnimalsTest是我们指定用来运行组成测试套件的多个*.Feature文件的Java类的名称。有一种很好的方法来标记您的测试,上面的示例演示了如何运行除标记为@Ignore的测试之外的所有测试。

对于JUnit4,可以通过@KarateOptions注释在测试类中指定标记选项,在这种情况下,您不需要在命令行传递-Dkarate.options:

通过使用以下maven-surefire-plugin配置,您可以锁定您只想执行用作测试套件的单个JUnit类这一事实:

注意如何使用<;systemProperties>;配置指定karate.options。如果存在@KarateOptions注释(在AnimalsTest.java上),则此处的选项将覆盖指定的相应选项。

TEST{Include';Animals/AnimalsTest.java';//将空手道选项拉入运行时系统Property&34;空手道.options";,System.properties.getProperty(";karate.options";)//将空手道环境拉入运行时系统Property";空手道.env";,System.properties.getProperty(";karate.env";)//确保始终运行测试输出。upToDateWhen{False}}。

上述方法的最大缺点是不能并行运行测试。下一节将介绍在持续集成设置中推荐的空手道报告方法,重点介绍如何生成大多数CI工具可以使用的JUnit XML格式。还会发出Cucumber JSON格式,这为您提供了使用第三方maven插件生成漂亮报告的大量选项。

最重要的是,您可以并行运行测试,而不必依赖于第三方黑客,这些黑客会在pom.xml或build.gradle中引入代码生成和配置。

空手道可以并行运行测试,并极大地缩短执行时间。这是一个核心特性,不依赖于JUnit、Maven或Gradle。

您可以很容易地选择功能和标记,以非常灵活的方式运行和编写测试套件。

您可以使用返回的。

.