Tag: bdd

XCFit:具有Swift 3.1和Xcode 8.3支持的iOS完整堆栈BDD框架

XCFit是Xcode中的全栈iOS BDD框架。 XCFit设置带有框架代码和目录结构的Xcode模板,这有助于我们开始使用BDD,而XCFit Swift Framework提供了许多预定义的BDD样式步骤,从而可以用更少的代码来实现自动化BDD。 您可以在Github上阅读XCFit的详细信息。 XCFit 4.0已发布,具有很多功能,简短的发行说明可在GitHub上获得。 让我们详细了解XCFit 4的新功能。 XCFit 4.0 XCFit 4.0是主要版本,对Swift框架进行了许多改进。 XCFit 4 .0具有以下主要更改。 支持Swift 3.1和Xcode 8.3 添加了对带有集成Cucumberish库的XCFit框架的迦太基支持。 为XCFit和Cucumberish添加了许多预定义步骤,以便我们可以将其直接用于我们的项目中。 通过将XCFit和Fitnesse模板分别放在不同的命令中来改进Xcode模板。 在Youtube上使用Video Demo改进了XCFit的README和Web页面文档。 让我们简要地看到新的变化。 Swift 3.1支持 苹果刚刚发布了Swift-3.1-dev快照,其中对XCTest框架进行了一些有用的更改。 您可以在DZone博客上的XCUITests中阅读有关新添加的类的信息。 基本上,XCUITest现在支持异步测试,并能够使用新类控制Siri。 苹果已经添加了XCWaiter类,以使XCFit能够更好地等待服务员。 XCFit 4.0是完全基于Swift 3.1构建的,您可以在Cocoapods上看到Swift版本。 这个想法是从XCFt 3.1开始完全支持XCFit Swift框架。 如果尚未安装Swift 3.1,则可能需要等到Swift 3.1公开发行版才能使用XCFit 4.0的新功能。 迦太基支持 XCFit Swift框架现在可以使用Carthage构建,以前它仅与Cocoapods一起使用,但是XCFit 4.0也为Carthage添加了支持。 XCFit依赖于Cucumberish框架,因此我们可以通过拉XCFit来获得这两个框架。 只需在项目根目录中的Cartfile中添加以下内容 Github“ Shashikant86 / XCFit” 现在,我们可以使用以下命令下载并构建框架 $ carthage更新—平台iOS […]

使用解析器组合器在Swift中进行高级UI测试

我一直喜欢Cucumber风格在iOS上进行UI测试。 但是我真的不喜欢在计算机上管理15000个红宝石版本,更不用说确保团队运行相同的版本,gem(我在看着你calabash-ios )等等。 我也希望它简单:只需读取代码,然后按“运行测试”即可。 因此,我决定在Swift中编写一个简单的Gherkin解析器。 我希望测试的结构如下: 方案:导入按钮起作用 鉴于我在主屏幕上 当我点击“导入”时 然后打开导入屏幕 func I_am_on_the_home_screen(){ … } func the_import_screen_opens(){ … } 该方案位于最上方,执行功能位于其下方。 请注意,没有“ I_tap_Import”功能,我希望tap和type具有足够的通用性,以使我的框架能够理解它。 解析中 POC版本基本上是在进行字符串比较和模式匹配,但是您可以想象,这不是非常有效和灵活。 对于“真实”版本,我使用了解析器组合器。 观看Swift讨论解析数学表达式的视频时,解析器组合器引起了我极大的兴趣。 联机有一些解析器组合器的介绍,因此在这里我不会做太多详细介绍,但是它的大致工作原理是这样的:基本解析器(例如,字符)使用…悬念…组合器组合在一起! 创建更复杂的解析器( 字符串解析器= n × 字符解析器),并且可以应用一些逻辑来创建语法(字符串是直到行尾的每个字符) 我花了几天的时间来“获取”它,但是一旦我将所有内容放到白板上,一切都变得有意义。 简而言之,它解析场景时忽略了前导和尾随空格。 当有一个“ tap ”关键字时,它将使用加引号的字符串作为参数来调用预建的tap函数(例如, Given I tap on “continue”调用app.buttons[“continue”].tap() 当有’ type ‘关键字时,它将使用加引号的字符串作为参数来调用预构建类型函数(例如, Given I type “hello” in field “id”调用app.textFields[“id”].typeText(“hello”) )) 如果没有关键字,它将调用带下划线的分隔线命名函数(例如, Then I […]

峰值和稳定仅在以下情况下有效:

如果您正在练习敏捷,您可能知道峰值 。 这是一个有时间限制的代码实验,目标​​是学习。 丹·诺斯(Dan North)提出了一个新的概念,称为“ 峰值和稳定”。 这是一种高纪律模式,目的是通过不花时间在不重要的功能上进行测试,重构和设计,从而快速创造价值。 我们的想法始终是从一个高峰开始,我们将向用户学习,并承诺以后例如使用测试驱动开发 (TDD)来稳定它。 它可以帮助团队将重点放在对客户重要的问题上,并且如果代码没有带来任何价值,也可以避免丢掉代码。 我发现这种方法非常有效,另一方面,我对将凌乱的代码创建到生产代码中并在以后使其稳定的想法感到不满意。 我是Robert C Martin如何描述专业开发人员的忠实拥护者: 专业开发人员切勿推动任何未经测试的代码生产线。 -罗伯特·C·马丁(鲍勃叔叔) 我认为只有将尖峰与生产代码隔离开,S pike和Stabilize才能起作用。 当需要稳定它时,使用TDD,SOLID原理并对其进行清理很容易将实际代码移入生产环境。 在iOS开发中,使用Swift Playground可以很容易地将尖峰与生产代码隔离开。 苹果在博客文章中将其描述为: 交互式游乐场可以帮助您快速原型化和构建应用程序,并提供另一种与代码交互的好方法。 通过与生产代码隔离的原型来探索新功能,使开发人员可以从可行的投资中寻求可行的回报 。 肯特·贝克(Kent Beck)在他的3X概念中对此进行了描述: 冒险寻求可行投资的可行回报。 成功的勘探是无法预测的,因此最高的期望值策略是降低实验成本,并为许多不相关的实验投入少量资金。 如果您幸运的话,这些实验之一证明是出乎意料的成功 最后,我认为所有iOS开发人员都应始终从Swift Playground页面开始,然后将代码拉成看起来像是首先经过测试驱动的形状 🤫。 丹·诺思(Dan North)在GOTO会议上谈论尖刺和稳定(15:50至27:30) 肯特·贝克(Kent Beck)谈论3X概念(始于20:21) 布兰登·威廉姆斯在FrenchKit会议上谈论操场驱动开发 如果您认为这将有助于其他开发人员更好地开发产品,请随时发表评论和分享。

连接点:BDD,TDD,用例,体系结构和模块化设计

这使我们回到上一集中提出的模块化体系结构: 在下一个情节中,我们将开始实现上述要求,因此,请立即订阅我们的YouTube频道,并每周获取免费的新情节 。 最初在 www.essentialdeveloper.com上 发布 。 我们一直在帮助敬业的开发人员从低薪工作转变为高级职位-有时只需几周! 为此,我们会不断进行和分享免费的市场研究,以了解如何提高同理心,正直和经济学的技巧。 如果您想从事自己的职业,请立即免费获取我们的最新研究成果。 如果您喜欢本文,请访问我们的网站https://essentialdeveloper.com,并获得更多类似的深度定制内容。 在以下位置关注我们:YouTube•Twitter•Facebook•GitHub

iOS XCUITest –黄瓜

在XCode中让iOS工程师对BDD感到兴奋。 免责声明:本主题与上下文有关,如何使用Cucumberish可以使iOS开发工程师或UI自动化测试团队受益。 本文旨在通过使用Cucumberish作为其本机iOS开发的一部分来使iOS工程师兴奋。 在介绍Cucumberish库之前,我想快速介绍一些初始要点。 什么是黄瓜/黄瓜/行为驱动开发(BDD) 黄瓜测试的结构 跨平台移动测试工具的一些注意事项 我是一名iOS工程师,并且一直在编写各种iOS自动化测试框架:UIAutomation(使用javascript),Calabash(使用ruby),Sen Testing(目标C),“ XCTest + Gherkin” cocoapods,以及目前的“ Cucumberish”。 我还找到了一种编写XCUITest来断言Google Analyics网络有效负载的方法。 这是一个非常有趣的主题,但是我将其保存在另一篇文章/演讲中……敬请期待。 1.什么是黄瓜/黄瓜/行为驱动的发展(BDD) Cucumber是一种软件工具,用于使用Gherkin语言执行行为驱动的测试(BDD)。 Gherkin Language本身与平台无关,它为产品所有者和业务分析人员提供了结构化的模板,以通过用例描述业务需求。 它的主要特征是“ Given-When-Then”子句的存在。 行为驱动开发(BDD) 与产品所有者和利益相关者合作以拟定可为客户带来价值的用例规范列表的过程。 这些规范使用Ghenn-When-Then Gherkin语言写入“功能”文件。 即使非工程师也很容易理解功能文件,这促进了整个组织的协作。 可以使用BDD工具(例如黄瓜,阿皮,黄瓜,葫芦,硒)将其自动化。 对于跨平台测试,功能文件是组织具有可在所有平台上使用的集中式规范的绝佳选择。 上面的BDD示例可以在Web和移动应用程序上使用。 在敏捷开发过程中常见。 2.黄瓜测试的结构 黄瓜测试套件包含一组功能文件。 它们每个都有一个“ .feature”扩展名。 每 功能文件包含一个或多个描述软件特定功能的方案。 使用多行用Gherkin编写的“步骤”来编写方案。 步骤定义是一小段代码 ,上面附加了一个模式 。 该模式用于将步骤定义链接到所有匹配的步骤,并且代码是Cucumber看到小黄瓜步骤时将执行的代码 。 [https://cucumber.io/docs/reference#step-definitions] 一旦定义了步骤,就可以继续为每个步骤编写测试/断言实现 。 请注意,如果使用适当的正则表达式格式,则可以使您的步骤对于测试套件更可重用。 3.关于跨平台移动测试工具的一些说明 在移动领域,市场上有一些工具试图通过引入单独的测试运行器来简化跨平台测试的复杂性。 iOS中使用的最受欢迎的是Calabash和Appium。 在我看来,以上问题是工程团队需要投资的额外开销。实现跨平台功能的另一种想法是,仅跨平台绑定通用功能文件,并允许灵活地选择最合适的测试运行器进行开发效率。 对于iOS开发,理想的情况是我们可以在XCode中执行Gherkin BDD功能文件,并且其步骤定义/实现可以用Swift编写。 哦,是的,还有一个更理想的标准:通过Cocoapods安装! […]

BDD使用XCUITest的XCTActivity功能吗?

苹果公司最近宣布了XCUITest框架的新功能。 活动的一项重要功能就是可以将XCTest操作组织为人类可读的活动。 新协议XCTActivity已添加到XCTest框架。 注意:本文最初发布在我的个人博客上 什么是XCUITests中的活动 通常,UI Tests在执行过程中会执行许多操作,例如,点击按钮,滑动等。到目前为止,Xcode中的XCTest报告显示了测试报告中的所有操作,这些操作不是特别可读。 活动是通过提供有意义的名称将这些操作分组的方式,因此XCTest结果将在结果中使用该活动名称以使其更具可读性。 您可以在此处阅读有关Apple官方文档中活动的更多信息。 我们可以在任何动作上进行活动 什么是BDD BDD aka行为驱动开发是通过使用Gherkin或类似格式的可执行规范来开发应用程序的过程,以便程序员可以将这些规范用于开发,而业务人员可以将其用于需求规范或实时文档。 BDD是一种由内而外的开发方法。 您可以在此处了解有关BDD的更多信息 我们可以使用XCTActivity进行BDD吗? 让我们尝试回答这个问题。 想象一下,我们将创建一个Greeter应用程序,该应用程序在输入时会向用户致意。 所以我们的应用有两个要求 应用程序应具有输入按钮 当用户点击输入按钮时,它应该显示问候消息 让我们来编写这个的Gherkin功能文件: 功能:招呼用户 场景:用户应该看到问候语 给定的应用程序启动 当用户点击输入按钮时 那我看一下问候语 现在,我们以人类可读的格式编写了所有需求。 让我们深入研究代码。 在Xcode内创建一个名为Greeter的新单视图应用程序,并包括UI测试。 在我们的UI测试中,我们可以添加带有方案名称的测试和带有步骤名称的“活动”,如下所示 func testUserShouldSeeGreetingsMessage(){ XCTContext.runActivity(名称:“启动应用程序”) XCUIApplication()。launch() } XCTContext.runActivity(名称:“当用户点击输入按钮时”) XCUIApplication()。buttons [“ enter”]。tap() } XCTContext.runActivity(named:“然后我应该看到问候消息”){_ XCTAssertTrue(XCUIApplication()。staticTexts [“ Welcome”]。exists) } 当我们第一次运行测试时,它将失败,因为没有按钮或静态文本。 我们可以轻松实现按钮和静态。 使用辅助功能标识符“输入”将按钮添加到主故事板,并添加标签“ welcomeText”。 现在创建IBAction到按钮以在点击时显示“欢迎”文本。 我们的ViewController将如下所示: @IBOutlet弱var welcomeText:UILabel! @IBAction […]

XCFit 7.0发布:XCTActivity,新的Xcode模板和多个CI服务支持

XCFit-7.0的新版本刚刚发布,具有一些新功能。 XCFit在版本6.0发行版中已经支持Xcode 9和Swift 4。 XCFit是Xcode for iOS应用程序中Xcode的面向全栈协议的BDD,使用Swift使用XCUITest。 XCFit允许我们使用诸如Give / When / Then格式的工具以人类可读的语言编写Swift的BDD样式API /合同级别,UI和验收测试。 在这篇简短的文章中,我们将看到XCFit-7.0的新功能。 此版本具有一些新功能,例如XCTActivity,新Xcode模板和持续集成服务支持。 我们将详细介绍以下新内容 XCTActivity支持 Xcode 9和XCTActivity支持的新Xcode模板 对XCFit的多个持续集成服务支持 UI测试通常是长时间运行的,并且在那里发生许多动作,例如,点击按钮,滑动等。到目前为止,XCTest报告显示了测试报告中的所有动作,这些动作不是特别可读。 活动是通过提供有意义的名称来将这些操作组织到组中的方法,因此XCTest结果将在结果中使用该活动名称以使其更具可读性。 您可以在此处阅读有关Apple官方文档的更多活动。 我们可以将活动分散到任何一组操作上,例如以干净状态启动应用程序 XCTContext.runActivity(名称:“鉴于我已经以干净状态启动了应用程序”) XCUIApplication()。launchArguments = [“ -StartFromCleanState”,“ YES”] XCUIApplication()。launch() } 当我们运行测试时,然后在测试报告中,我们将看到“鉴于我已经以干净状态启动了该应用程序”,因此更具可读性。 我们仍然可以通过扩展活动来访问基本操作。 XCTActivity现在支持XCFit预定义步骤。 现在,所有步骤都包装在XCTActivities中,以便可以读取Xcode报告。 您将在本文结尾的演示视频中看到这一点。 如果您使用过XCFit,那么您可能知道XCFit提供了Xcode模板,以开始使用Xcode中的面向协议的BDD。 可以使用Rubygem安装XCFit模板 $ gem install xcfit 如果您正在使用系统(预安装)Ruby(2.0),则可能需要使用sudo。 XCFit gem将用于为Xcode设置所有Xcode模板。 当前的Xcode模板具有Xcode组结构,如下所示 Feature.swift 该文件具有您的功能,它将所有可以作为验收测试实现的需求(测试)。 该文件包含Swift协议。 FeatureSteps.swift 该文件包含模板代码,该模板代码如何在功能协议之上使用Swift扩展实现给定功能的步骤定义。 它还提供了一些示例,这些示例在实现步骤定义时如何使用XCTActivity。 FeatureElements.swift 该文件包含与功能有关的所有XCUIElement。 […]

Swift的行为驱动开发框架

XCBlog上的原始帖子在这里 最近,有多家公司在寻找使用Swift编写的iOS应用程序的BDD支持工具。 由于Cucumber没有对Swift的官方支持,因此大多数人都在努力为Swift项目寻找合适的BDD工具。 这篇文章将重点介绍一些在Swift应用程序中支持BDD的工具。 BDD aka行为驱动开发是通过使用Gherkin或类似格式的可执行规范来开发应用程序的过程,以便程序员可以将这些规范用于开发,而业务人员可以将其用于需求规范或实时文档。 BDD是一种由内而外的开发方法。 您可以在此处阅读有关BDD的更多信息。 由于缺少适当的BDD工具(如Swift中的Cucumber),iOS世界中的行为驱动开发始终面临挑战。 在网站开发中,BDD选项有特定于语言的选项。 有一些解析Gherkin语言语法的工具(Given / When / Then),我们可以执行BDD场景,例如Ruby的Cucumber,JavaScript的CucumberJS,Java的Cucumber-JVM,C#的SpecFlow,PHP的Behat等。适用于Spec级BDD的工具,例如Ruby的RSpec,PHP的PHPSpec,JavaScript的Jasmine。 但是,在iOS世界中,执行BDD的选项非常有限,尤其是对于Swift。 在本文中,我们将探讨Swift iOS应用程序当前使用的BDD选项。 使用诸如带Appiumor Calabash的Cucumber之类的工具可以轻松实现Gherkin Style BDD,但要在Xcode中支持BDD并非易事。 由于缺少适当的BDD工具(例如Swift中的Cucumber),iOS世界中的BDD始终具有挑战性。 Swift中没有可用的Gherkin解析器,因此Cucumber社区建议使用Objective-C Gherkin解析器。 这里提到了许多BDD工具来编写较低级别的测试,但是为了编写UI级别的测试,很少有选项可能没有Ruby中Cucumber的所有核心功能。 XCTest-Gherkin是另一个可用于在Xcode项目中实现BDD的工具。 在README文件上有关于其功能和限制的详细信息。 它纯净的表示形式,我们仍然可以使用String格式编写GWT(当时提供),但是主要缺点是我们无法编写或执行.feature文件,并且缺少许多核心的黄瓜功能,例如标签,过滤功能。 您需要使用CocoaPods或Carthage将XCTest-Gherkin作为UI测试目标的依赖项。 XCFit是另一个纯Swift实现,用于在Xcode项目中支持BDD。 它还提供了Xcode模板,以开始使用BDD,页面对象模式和面向协议的模式。 XCFit在Swift框架中有一些预定义的步骤,但是快速好处来自Xcode模板。 有关面向协议的BDD的更多信息,请参见此处。 另一个主要缺点是我们无法编写或执行.feature文件,并且缺少许多核心的黄瓜功能,例如标签,过滤功能。 Cucumberish是一个测试框架,可用于以Gherkin格式编写功能,并可从Xcode执行。 Cucumberish被编写为Objective-C,并使用来自Cucumber存储库的Objective-C Gherkin解析器。 能够从Xcode执行Gherkin功能文件非常好,但是Cucumberish有一些错误,在大多数情况下需要解决方法。 在完全Swift项目中引入Objective-C依赖关系也有些棘手。 可以使用CocoaPods或Carthage将黄瓜导入UI测试目标。 Plowman是Gherkin语言的另一种测试运行器,我们可以从命令行编写和执行功能文件。 在Ploughman的README文件中有很好的信息。 这缺少核心Cucumber的许多功能,例如示例,标签和过滤器。 可以使用Swift Package Manager导入此软件包。 SwiftGherkin是另一个Swift软件包,用于处理基于gherkin.feature的文件。 这是一个新创建的程序包,它支持功能,方案,方案大纲和步骤,但是将来还会支持所有其他核心黄瓜功能。 您可以继续关注该存储库,以获取有关此软件包的更多新闻。 该软件包只能与Swift Package Manager一起使用。 与用于Ruby的RSpec,用于PHP的PHPSpec,用于JavaScript的Jasmine相似,很少有工具可以为较低级别的实现编写规范。 我们将在Swift中看到那些规范级别的BDD选项。 […]

用Cedar的iOStesting控制器

我想用Cedartesting一个控制器,但不能真正理解为什么它不工作。 控制器永远不会显示,viewDidLoad或viewDidAppear永远不会被调用。 这是锡达本来不是要做的,还是我的错误? describe(@"MyController", ^{ __block UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil]; __block UINavigationController *root = (UINavigationController *)[[[[UIApplication sharedApplication] delegate]window ]rootViewController]; __block MyViewController *model = [storyboard instantiateViewControllerWithIdentifier:@"MyController"]; [root pushViewController:model animated:YES]; it(@"should test something", ^{ expect(model.content).to(be_truthy); }); });

如何部分模拟外部对象

我有类方法来testing依赖对象(Keys对象) APIRouter.m + (NSURL*)apiURLWithPath:(NSString*)path { MyKeys *keys = [MyKeys new]; NSString *url = [NSString stringWithFormat:@"%@?api_key=%@", path, [keys APIKey]]; return [NSURL URLWithString:url]; } 我试图部分模拟这个Keys对象并返回“MY_API_KEY”值,但testing方法失败并返回真实的API密钥(例如as78d687as6d7das8da)。 APIRouterSpec.m describe(@"APIRouter", ^{ it(@"should return url for api", ^{ Keys *keys = [Keys new]; id keysPartialMock = OCMPartialMock(keys); OCMStub([keysPartialMock APIKey]).andReturn(@"MY_API_KEY"); NSURL *url = [APIRouter apiURLWithPath:@"http://www.api.com/v1/events"]; expect([url absoluteString]).to.equal([NSString stringWithFormat:@"http://www.api.com/v1/events?api_key=MY_API_KEY"]); }); });