iOS 测试/规范 TDD/BDD 以及集成和验收测试

2024-01-02

在 iPhone 上进行行为驱动开发的最佳技术是什么?有哪些开源示例项目可以展示这些技术的合理使用?以下是我发现的一些选项:


单元测试 http://en.wikipedia.org/wiki/Unit_testing

测试::单位 http://test-unit.rubyforge.org/ Style

  1. OCUnit/SenTestingKit http://www.sente.ch/software/ocunit/ as explained in iOS Development Guide: Unit Testing Applications http://developer.apple.com/library/ios/#documentation/Xcode/Conceptual/iphone_development/135-Unit_Testing_Applications/unit_testing_applications.html & other OCUnit references http://www.sente.ch/software/ocunit/#More.
    • 例子:iPhone单元测试 http://developer.apple.com/library/ios/#samplecode/iPhoneUnitTests/Introduction/Intro.html#//apple_ref/doc/uid/DTS40008868, Three20 http://three20.info/
  2. CATCH https://github.com/philsquared/Catch
  3. GHUnit https://github.com/gabriel/gh-unit
  4. Mac 版 Google 工具箱:iPhone 单元测试 http://code.google.com/p/google-toolbox-for-mac/wiki/iPhoneUnitTesting

RSpec http://relishapp.com/rspec Style

  1. Kiwi http://www.kiwi-lib.info/(其中还带着嘲讽和期待)
  2. Cedar https://github.com/pivotal/cedar
  3. Jasmine http://pivotal.github.com/jasmine/ with 用户界面自动化 http://developer.apple.com/library/ios/#documentation/DeveloperTools/Reference/UIAutomationRef/_index.html如图所示dexterous 的 iOS 验收测试规范 https://github.com/dexterous/iOS-Acceptance-Testing/tree/master/specs

验收测试 http://en.wikipedia.org/wiki/Acceptance_testing

Selenium http://seleniumhq.org/ Style

  1. UI 自动化(在设备上运行)

    • UI 自动化仪器指南 http://developer.apple.com/library/ios/#documentation/DeveloperTools/Conceptual/InstrumentsUserGuide/Built-InInstruments/Built-InInstruments.html#//apple_ref/doc/uid/TP40004652-CH6-SW75
    • UI 自动化参考文档 http://developer.apple.com/library/ios/#documentation/DeveloperTools/Reference/UIAutomationRef/_index.html
    • 调优js https://github.com/alexvollmer/tuneup_js- 与 UIAutomation 一起使用的很酷的库。
    • 将用户界面操作捕获到自动化脚本中 http://developer.apple.com/library/ios/#documentation/AnalysisTools/Conceptual/WhatsNewInstruments/NewFeatures42/NewFeatures42.html#//apple_ref/doc/uid/TP40010950-CH4-SW8

      可以使用黄瓜(用 JavaScript 编写) https://github.com/cucumber/cucumber/blob/master/examples/v8/features/step_definitions/fib_steps.js驱动 UI 自动化。这将是一个很棒的开源项目。然后,我们可以写Gherkin http://en.wikipedia.org/wiki/Gherkin运行 UI 自动化测试。现在,我只写 Gherkin 作为评论。

    UPDATE: 西葫芦框架 http://www.zucchiniframework.org/似乎融合了 Cucumber 和 UI 自动化! :)

    旧博客文章:

    • Alex Vollmer 的 UI 自动化教程 http://alexvollmer.com/posts/2010/07/03/working-with-uiautomation/
    • O'Reilly 回答 UI 自动化教程 http://answers.oreilly.com/topic/1646-how-to-use-uiautomation-to-create-iphone-ui-tests/
    • Adi Saxena 的 UI 自动化教程 http://www.codeproject.com/KB/iPhone/UI_Automation_Testing.aspx
  2. UISpec http://code.google.com/p/uispec/ with UISpecRunner https://github.com/twotoasters/UISpecRunner

    • UISpec 在 Google Code 上开源 http://code.google.com/p/uispec/.
    • UISpec 有全面的文档 http://code.google.com/p/uispec/wiki/Documentation.
  3. FoneMonkey http://www.gorillalogic.com/fonemonkey

Cucumber http://cukes.info/ Style

  1. Frank https://github.com/moredip/Frank and iCuke https://github.com/BlueFrogGaming/icuke(基于黄瓜遇上 iPhone 谈话 http://www.slideshare.net/undees/iphone-meets-cucumber)

    • The 弗兰克·谷歌集团 http://groups.google.com/group/frank-discussiCuke谷歌集团 http://groups.google.com/group/icuke.
    • Frank同时在设备和模拟器上运行,而iCuke仅在模拟器上运行。
    • 弗兰克似乎有一套更全面的步骤定义iCuke的步骤定义 https://github.com/BlueFrogGaming/icuke/blob/master/lib/icuke/icuke_world.rb. And, Frank 在他们的 wiki 上还有一个步骤定义纲要 https://github.com/moredip/Frank/wiki/Step-Definition-compendium.
    • (类似于 Merb 和 Rails 的合并),因为它们有相同的共同目标:Cucumber for iOS。
  2. KIF(保持功能) https://github.com/square/KIF by Square https://squareup.com/

  3. 西葫芦框架 http://www.zucchiniframework.org/使用 Cucumber 语法编写测试,并使用 CoffeeScript 进行步骤定义。

补充内容

  • OCMock http://www.mulle-kybernetik.com/software/OCMock/ for mocking http://en.wikipedia.org/wiki/Mock_object
  • 奥查姆克雷斯特 http://code.google.com/p/hamcrest/wiki/TutorialObjectiveC and/or Expecta https://github.com/petejkim/expecta为了期望

结论

嗯,显然,这个问题没有正确的答案,但这是我目前选择的:

对于单元测试,我曾经使用OCUnit/SenTestingKit http://www.sente.ch/software/ocunit/在 XCode 4 中。它简单而可靠。但是,我更喜欢 BDD 语言而不是 TDD(为什么 RSpec 比 Test::Unit 更好 http://www.rubyinside.com/dhh-offended-by-rspec-debate-4610.html?)因为我们的言语创造了我们的世界。所以现在我用猕猴桃与 ARC https://github.com/allending/Kiwi/pull/42#issuecomment-1768713 & Kiwi 代码完成/自动完成 https://github.com/allending/Kiwi/issues/30#issuecomment-1550718。与 Cedar 相比,我更喜欢 Kiwi,因为它构建在 OCUnit 之上,并带有 RSpec 风格的匹配器和模拟/存根。更新:我现在正在研究 OCMock,因为目前,Kiwi 不支持存根免费桥接对象 https://github.com/allending/Kiwi/issues/61.

对于验收测试,我使用 UI 自动化,因为它非常棒。它可以让您记录每个测试用例,从而自动编写测试。而且它是苹果公司开发的,所以它的未来很有前途。它也适用于设备和 Instruments,它允许其他很酷的功能,例如显示内存泄漏。不幸的是,使用 UI Automation,我不知道如何运行 Objective-C 代码,但使用 Frank & iCuke 就可以。因此,我将仅使用单元测试来测试较低级别的 Objective-C 内容,或者创建UIButton只适用于TEST构建配置 https://stackoverflow.com/questions/6748087/xcode-test-vs-debug-preprocessor-macros/6763597#6763597,单击后将运行 Objective-C 代码。

您使用哪些解决方案?

相关问题

  • 目前是否有适用于 iOS4 和 Xcode4 的 BDD 解决方案? https://stackoverflow.com/questions/6036891/is-there-a-bdd-solution-that-presently-works-well-with-ios4-and-xcode4
  • SenTestingKit(与 XCode 集成)与 XCode 4 上的 GHUnit 进行单元测试? https://stackoverflow.com/questions/5455771/sentestingkit-integrated-with-xcode-versus-ghunit-on-xcode-4-for-unit-testing
  • 使用 OCunit 在 iOS 上测试异步代码 https://stackoverflow.com/questions/4685582/testing-asynchronous-code-on-ios-with-ocunit
  • Xcode 4 中的 SenTestingKit:异步测试? https://stackoverflow.com/questions/6190486/sentestingkit-in-xcode-4-asynchronous-testing/6190553#6190553
  • iPhone 上的单元测试如何进行? https://stackoverflow.com/questions/862244/how-does-unit-testing-on-the-iphone-work

tl;dr

在 Pivotal,我们编写了 Cedar,因为我们在 Ruby 项目中使用并喜爱 Rspec。 Cedar 并不是要取代 OCUnit 或与 OCUnit 竞争;而是要与 OCUnit 竞争。它的目的是为 Objective C 带来 BDD 风格测试的可能性,就像 Rspec 率先在 Ruby 中进行 BDD 风格测试一样,但并没有消除 Test::Unit。选择其中之一很大程度上取决于风格偏好。

在某些情况下,我们设计 Cedar 是为了克服 OCUnit 工作方式中的一些缺点。具体来说,我们希望能够在测试中使用调试器,从命令行和 CI 构建中运行测试,并获得测试结果的有用文本输出。这些东西可能或多或少对你有用。

长答案

在 Cedar 和 OCUnit 等两个测试框架之间做出选择取决于两点:首选风格和易用性。我将从风格开始,因为这只是一个意见和偏好的问题;易用性往往是一系列权衡的结果。

风格考虑因素超越了您使用的技术或语言。 xUnit 风格的单元测试比 BDD 风格的测试存在的时间要长得多,但后者迅速流行起来,这主要归功于 Rspec。

xUnit 式测试的主要优点是其简单性和广泛采用(在编写单元测试的开发人员中);几乎任何您可以考虑用来编写代码的语言都有可用的 xUnit 风格框架。

与 xUnit 风格相比,BDD 风格的框架往往有两个主要区别:如何构建测试(或规范),以及编写断言的语法。对我来说,结构差异是主要的区别。 xUnit 测试是一维的,对于给定测试类中的所有测试都使用一个 setUp 方法。然而,我们测试的类不是一维的;而是一维的。我们经常需要在几种不同的、可能存在冲突的环境中测试操作。例如,考虑一个带有 addItem: 方法的简单 ShoppingCart 类(出于本答案的目的,我将使用 Objective C 语法)。与购物车包含其他商品时相比,当购物车为空时,此方法的行为可能有所不同;如果用户输入了折扣代码,则可能会有所不同;如果指定的商品无法通过所选的运送方式运送,则可能会有所不同;当这些可能的条件相互交叉时,您最终会得到几何数量的可能上下文;在 xUnit 风格的测试中,这通常会导致出现许多名称类似于 testAddItemWhenCartIsEmptyAndNoDiscountCodeAndShippingMethodApplies 的方法。 BDD 风格框架的结构允许您单独组织这些条件,我发现这可以更轻松地确保涵盖所有情况,也更容易查找、更改或添加单个条件。例如,使用 Cedar 语法,上面的方法将如下所示:

describe(@"ShoppingCart", ^{
    describe(@"addItem:", ^{
        describe(@"when the cart is empty", ^{
            describe(@"with no discount code", ^{
                describe(@"when the shipping method applies to the item", ^{
                    it(@"should add the item to the cart", ^{
                        ...
                    });

                    it(@"should add the full price of the item to the overall price", ^{
                        ...
                    });
                });

                describe(@"when the shipping method does not apply to the item", ^{
                    ...
                });
            });

            describe(@"with a discount code", ^{
                ...
            });
        });

        describe(@"when the cart contains other items, ^{
            ...
        });
    });
});

在某些情况下,您会发现包含相同断言集的上下文,您可以使用共享示例上下文来干燥这些断言。

BDD 风格框架和 xUnit 风格框架之间的第二个主要区别是断言(或“匹配器”)语法,它只是使规范的风格变得更好一些;有些人真的喜欢它,有些人则不喜欢。

这就引出了易用性的问题。在这种情况下,每个框架都有其优点和缺点:

  • OCUnit 的历史比 Cedar 长得多,并且直接集成到 Xcode 中。这意味着创建新的测试目标很简单,而且在大多数情况下,启动并运行测试“就可以了”。另一方面,我们发现在某些情况下,例如在 iOS 设备上运行,让 OCUnit 测试正常工作几乎是不可能的。设置 Cedar 规范比 OCUnit 测试需要更多的工作,因为您已经获得了库并自己链接到它(在 Xcode 中从来不是一个简单的任务)。我们正在努力让设置变得更容易,我们非常欢迎任何建议。

  • OCUnit 将测试作为构建的一部分运行。这意味着您不需要运行可执行文件来运行测试;如果任何测试失败,您的构建就会失败。这使得运行测试的过程变得更简单,并且测试输出直接进入构建输出窗口,这使得它很容易查看。我们选择将 Cedar 规范构建到一个可执行文件中,您可以单独运行它,原因如下:

    • 我们希望能够使用调试器。您运行 Cedar 规范就像运行任何其他可执行文件一样,因此您可以以相同的方式使用调试器。
    • 我们希望在测试中轻松登录控制台。您可以在 OCUnit 测试中使用 NSLog(),但输出会进入构建窗口,您必须在其中展开构建步骤才能读取它。
    • 我们希望在命令行和 Xcode 中都能轻松阅读测试报告。 OCUnit 结果在 Xcode 的构建窗口中显示得很好,但从命令行构建(或作为 CI 过程的一部分)会导致测试输出与大量其他构建输出混合在一起。通过单独的构建和运行阶段,Cedar 将输出分开,因此可以轻松找到测试输出。默认的 Cedar 测试运行程序复制标准打印样式“.”。对于每个通过的规范,“F”表示未通过的规范,等等。Cedar 还能够使用自定义报告器对象,因此您可以让它以您喜欢的任何方式输出结果,只需一点努力。
  • OCUnit 是 Objective C 的官方单元测试框架,由 Apple 支持。苹果基本上拥有无限的资源,所以如果他们想要完成某件事,它就会完成。毕竟,这是我们正在玩的苹果沙盒。然而,硬币的另一面是,苹果每天都会收到数以百万计的支持请求和错误报告。他们非常擅长处理所有问题,但他们可能无法立即或根本无法处理您报告的问题。 Cedar 比 OCUnit 更新且不够成熟,但如果您有疑问、问题或建议,请发送消息到 Cedar 邮件列表 ([电子邮件受保护] /cdn-cgi/l/email-protection),我们将尽力帮助您。另外,请随意从 Github (github.com/pivotal/cedar) 分叉代码并添加您认为缺少的任何内容。我们将测试框架开源是有原因的。

  • 在 iOS 设备上运行 OCUnit 测试可能很困难。老实说,我已经有一段时间没有尝试过这个了,所以它可能会变得更容易,但上次我尝试时,我根本无法让 OCUnit 测试让任何 UIKit 功能正常工作。当我们编写 Cedar 时,我们确保可以在模拟器和设备上测试依赖于 UIKit 的代码。

最后,我们编写了 Cedar 用于单元测试,这意味着它与 UISpec 这样的项目没有真正的可比性。自从我尝试使用 UISpec 以来已经有一段时间了,但我理解它主要专注于以编程方式驱动 iOS 设备上的 UI。我们特别决定不尝试让 Cedar 支持这些类型的规范,因为 Apple(当时)即将发布 UIAutomation。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iOS 测试/规范 TDD/BDD 以及集成和验收测试 的相关文章

随机推荐

  • 如何在同一页面中拥有多个 jQuery 颜色框

    我有一个页面需要从多个位置打开颜色框 一种是在文档就绪函数中如下 a rel q1 colorbox opacity 0 8 width 800px height 75 另一个需要从谷歌图表中打开一个完全不相关的颜色框 并在 onclick
  • 64 位除以 32 位

    我正在寻找一种快速的方法来执行以下除法 被除数是一个有符号的 64 位整数 除数是一个有符号的 32 位整数 商应该是有符号的 64 位整数 不需要余数 低位 dword 的除数为零 我只使用 32 位数据类型 因为编译器对 64 位数据类
  • 我可以在多处理池星图方法中传递队列对象吗[重复]

    这个问题在这里已经有答案了 关于在 python 多处理池的 starmap 方法中传递多个参数 SO 中有很多问题 但我想问的是 我是否可以在方法中发送一个可以在不同进程之间共享的队列对象 我可以使用线程和多处理 Process 方法来完
  • pyparsing 可能包含或不包含值的字段

    我有一个类似于以下内容的数据集 Capture MICR Serial Pos44 Trrt 32904 Acct Tc 2064 Opt4 Split 我遇到的问题是我不知道如何正确编写 捕获 MICR 串行字段 的捕获 该字段可以为空
  • 指令模板函数的角度访问范围

    我有一个具有模板功能的指令 restrict E A is the default so you could remove this line scope field field template function element attr
  • 是否可以设置 TextBoxFor 生成的输入类型

    我在表单中使用 ASP NET MVC 3 TextBoxFor 并希望使用 type email 以便至少在某些移动设备上更轻松地输入 但找不到如何使用 TextBoxFor 设置它 这不是很容易就能实现的吗 In View Html L
  • 如何在 flutter 中使用 getx 使列表可观察

    我正在观看有关使用 Getx 和 API 的教程 设置用于获取数据的控制器后 我们声明了一个列表变量并使其可观察 obs 但列表格式已被弃用 你能帮我吗我现在该怎么做 var products List
  • 无法使用 IIS 7 加载图像

    我正在构建一个新的 Web 服务器 并且正在重新部署一个在 IIS6 中正常工作的 ASP Net 站点 不幸的是 没有任何图像正在加载 我收到了 404 错误 图像位于正确的文件夹中 我什至可以导航到网站中的正常页面 有什么建议么 可能是
  • Seabornpairplot 色调参数未按预期工作

    如果将 C 指定为 hue 参数的值 则预计 Seaborn 不会显示 C 列 我错了吗 sns pairplot df hue C 数据框 默认情况下 seaborn 将显示所有数字列 因此 如果您的 色调 列 在您的情况下为 C 列为字
  • 为 highchart 中的两个系列之一设置 minPointLength

    我的高图中有两个数据系列 并且只想对其中一个使用 minPointLength 这个可以设置吗 我的系列仅包含 名称 颜色和数据 我的图表配置如下所示 const chartConfig chart type column dashStyl
  • 如何安装源自 apt 包的 Python 绑定?

    我有一个网站托管在Heroku http heroku com 我现在想使用python qrtools包使用了ZBar条码扫描器 http zbar sourceforge net 在常规的 debian 基于 上 我可以做一个简单的操作
  • 为什么我无法在另一个文件中定义内联成员函数?

    我有三个文件 1 Joy h class Joy public void test 2 Joy cpp include Joy h inline void Joy test 3 main cpp include Joy h int main
  • 如何解决访问 CollabNet Subversion 控制台时出现 503 错误?

    我正在使用 Collabnate Subversion Edge 尝试访问 URL 时出现以下错误http localhost 3343 csvn http localhost 3343 csvn Collbnate 在 Windows S
  • 将 git 存储库移至第二台计算机?

    我有一个带有简单本地 git 存储库的项目 我想要move将该项目 文件夹等 转移到另一台计算机 并从现在开始从那里开始工作 我不想在旧机器上留下任何东西 当然除了我的其他 git 项目 我希望它就像我一直在新机器上工作一样 我可以简单地将
  • 405(不允许的方法)Laravel

    我在 Laravel 中尝试使用 ajax 删除项目时收到 405 方法不允许 请有人帮忙 这是我的路线 Route get home HomeController index gt name home Route post destroy
  • long long 在 32 位机器上的实现

    根据c99标准 尺寸为long long至少应为 64 位 这是如何在 32 位机器中实现的 例如 2 的加法或乘法 long longs 另外 什么相当于long long in C C 中的等效项也是 long long 标准并不要求它
  • 客户端无法连接到本地主机上的 RabbitMQ 服务器

    我通过 apt get 在 ubuntu 12 04 2 LTS 上安装了新的 RabbitMQ 3 1 3 并尝试在同一台服务器上启动消费者 但我遇到了连接问题 PhpAmqpLib Exception AMQPRuntimeExcept
  • Android studio java.lang.SecurityException:需要 INSTALL_LOCATION_PROVIDER 权限

    我正在android工作室工作 我正在移动应用程序上获取实时 GPS 坐标 在每个移动设备上都会生成坐标 但单个移动设备无法工作并给出zero 0 坐标有android版本9 下面是我的代码 SuppressLint MissingPerm
  • 使用 Promise 的 Lambda 的 sinon 存根

    我刚刚开始使用 sinon 并且在消除 DynamoDB 调用方面取得了一些初步成功 sandbox sinon createSandbox update stub sandbox stub AWS DynamoDB DocumentCli
  • iOS 测试/规范 TDD/BDD 以及集成和验收测试

    Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案或互动 在 iPhone 上进行行为驱动开发的最佳技术是什么 有哪些开源示例项目可以展示这些技术的合理