Cucumberish
Cucumberish 是一个针对行为驱动开发 (BDD) 的测试自动化框架。它受到最初在 Gherkin 语言中引入的 Cucumber 以其出色的方式编写自动化测试用例的启发。
如果您不确定 Cucumberish 是否适合您,请查阅 常见问题解答 部分
特性
- 全集成 Xcode 测试导航器。
- 可与持续集成服务器或云端服务一起使用;就像 XC 单元测试一样!
- 当任何测试失败时,Xcode 测试导航器会指到失败的 .feature 文件的行。
- 您的测试报告将像任何 XC 单元测试一样出现在 Reports 导航器中。
- 无需 Ruby、"仅命令行" 或任何其他 iOS 相关的语言或复杂的依赖关系链即可安装或使用 Cucumberish!
- 仅需要几分钟即可完成安装!
- 步骤实现直接在 Objective-C 或 Swift 中完成!这意味着您可以轻松地断言并调试步骤实现。
- 可用于单元测试以及 UI 测试目标!
以下是一个快速动画GIF,展示Cucumberish是如何工作的
手动安装
使用CocoaPods安装
在您的Podfile中添加以下内容
use_frameworks!
target 'YourAppTestTarget' do
pod 'Cucumberish'
end
按照设置步骤继续操作
使用Carthage安装
入门
现在您已经安装了Cucumberish并遵循了所有安装和安装后说明,现在是时候在几个额外的步骤中写出您的第一个简单的特性和场景了!由于具体步骤在不同项目中有所不同,我们不会深入探讨;我们只概述如何达到那里的通用方法。为了演示目的,我将假设您的测试目标是Objective-C目标;但同样原则可以应用于Swift目标。
首先,在您的特征文件夹中创建一个新文件;我们将称之为example.feature
。
注意:每个文件只能有一个特性,但可以有任意多的场景。
打开此文件以在Xcode(或您喜欢的任何文本编辑器)中编辑,并为您的第一个特性写入以下内容
Feature: Example
# This is a free text description as an inline documentation for your features, you can omit it if you want.
# However, it is advisable to describe your features well.
As someone who plans to automate the iOS project test cases, I will use Cucumberish.
# First scenario is the scenario name, which will also appear in a proper format in Xcode test navigator
Scenario: First scenario
# This is the first step in the scenario
# Also noteworthy; a "Given" step should be treated as the step that defines the app state before going into the rest of the scenario
# Or consider it as a precondition for the scenario;
# For example if the user must be logged in to post a comment, then you should say something like "Given the user is logged in" as your Given step.
Given I have a very cool app
# The grammar being used is completely defined by you and your team; it is up to you to find the best way to define your functionality.
# Only keep in mind that every step must start with "Given", "When", "Then", "And", or "But".
When I automate it with "Cucumberish"
Then I will be more confident about the quality of the project and its releases
现在您已经放置了一个酷炫的特性,是时候实现其步骤了。您只需关注步骤本身,而无需关心特性或场景。因此,您的步骤实现没有上下文。
在CucumberishInit函数的主体中,在调用-[Cucumberish beginExecution]
方法之前,添加以下内容
Given(@"I have a very cool app", ^(NSArray<NSString *> *args, NSDictionary *userInfo) {
//Now it is expected that you will do whatever necessary to make sure "I have a very cool app" condition is satisfied :)
NSLog(@"\"Given I have a very cool app\" step is implemented");
});
// The step implementation matching text can be any valid regular expression text
// Your regex capturing groups will be added to the args array in the same order they have been captured by your regex string
When(@"^I automate it with \"(.*)\"$", ^(NSArray<NSString *> *args, NSDictionary *userInfo) {
NSLog(@"I am gonna automate my test cases with \"%@\"", args[0]);
});
Then(@"I will be more confident about the quality of the project and its releases", ^(NSArray<NSString *> *args, NSDictionary *userInfo) {
NSLog(@"Implemented step for the sake of the example");
});
这就完成了!您已经实现了第一个特性场景步骤!有关有关步骤、传递给它的块和钩子的更多信息,请参阅CCIBlockDefinitions.h文件和Cucumberish Wiki。
示例
除wiki上可找到的所有信息以及特别针对步骤定义页面之外,看到示例的实际操作是最好的演示方式。您可以克隆此存储库并打开文件CucumberishLibraryTest/CucumberishLibrary.xcodeproj
。
在CucumberishLibrary
项目中,有五个目标
-
CucumberishLibrary目标
- 这是包含Cucumberish库的主要目标,我们将它用作可测试目标以在测试目标中进行测试。
-
CucumberishFeatureDefinition目标
- 此目标主要是不同方式定义步骤实现和让您熟悉大多数Cucumberish API的示例。
- 此目标中的大多数步骤使用较为复杂的正则表达式字符串,但您无需担心。只要你了解正则表达式的一些基础知识,就不用担心。如果您对正则表达式不太熟悉,步骤定义页面将非常有帮助。
-
CucumberishTests目标
- 在这个目标中,我们使用Cucumberish库来测试其行为。
单元测试
CucumberishLibrary项目位于CucumberLibraryTest文件夹中,包含两个目标,CucumberishTests和CucumberishFeatureDefinition,用于测试Cucumberish自身。
故障排除
我的测试用例场景失败是因为步骤未实现,但我确信我实现了它—现在怎么办?
这种情况可能是由于您的步骤定义文本与特征文件中编写的步骤不匹配。可能是因为您正则表达式的错误,或者定义步骤或步骤本身可能多了一个多余的空格。一个很好的调试位置是在文件夹Cucumberish/Core/Managers/CCIStepsManagers.m
中,执行方法findDefinitionForStep:amongDefinitions
我的测试用例失败,但当我点击Xcode测试导航器中的失败用例时,它不会打开失败的文件。
这种情况已知的两个原因
-
如果您的代码中有运行时崩溃,例如当您尝试访问一个只有一个元素的数组的第五个元素时。在这种情况下,向您的某个特征文件指出并无意义。但是您仍然需要找到问题;您可以在Xcode中设置异常断点,或打开报告导航器,并点击报告顶部的第一个测试项。在这个报告中,失败的案例将被展开,并显示所有可用信息。
如果您相信您已经确定了另一种类型的失败,请将其报告为一个问题。
常见问题解答
-
简而言之,Cucumberish是如何工作的?
- 非常简单。您在
.feature
文件中描述您的功能,并为每个功能定义一组场景,每个场景有一组步骤。然后Cucumberish将为每个功能创建一个XC测试套件,并为每个场景创建一个xCaseTest,并将步骤映射到您的代码。因此,最终以人类可读的特征实现,同时又以我们作为开发人员偏好的方式实现。
- 非常简单。您在
-
我想在我的测试目标中使用Swift,这有可能吗?
- 当然可以,请查看示例应用中的UI测试目标。它是完全使用Swift编写的!
-
我更喜欢使用Apple的UI测试框架以获得长期支持,使用Cucumberish还能做到这一点吗?
- YES!您可以将Cucumberish与您喜欢的框架和工具相结合!这也意味着Cucumberish不仅限于UI。
-
我仍然不知道Cucumberish是否适合我。是吗?您有一些选择
持续集成
持续集成(CI)过程强烈推荐,对确保您的应用程序保持功能非常有用。最简单的方法是使用机器人、Jenkins或任何其他使用xcodebuild的工具。对于使用xcodebuild的工具,请参阅manpage以获取有关使用测试目标指令的信息。
已知问题
当从测试导航器执行单个场景或功能时,其余测试用例将消失。您必须按下CMD+U(或从“测试”按钮)来再次显示测试用例,以便您可以全部运行测试用例。
贡献
我非常高兴您对为Cucumberish做出贡献感兴趣。当您对主存储库中的某些改进或新增内容做出了改进,并希望看到这些内容时,请通过创建一个pull request,我会尽快将其合并。
许可证
Cucumberish许可协议为MIT。有关更多信息,请参阅LICENSE文件。