iphone – iOS测试/规格TDD/BDD和集成与验收测试

在iPhone上使用行为驱动开发的最好的技术是什么?什么是一些开源示例项目,证明这些技术的正确使用?这里有一些选项,我发现:

Unit Testing

Test::Unit款式

> OCUnit/SenTestingKit,如iOS Development Guide: Unit Testing Applications&其他OCUnit references

>示例:iPhoneUnitTestsThree20

> CATCH
> GHUnit
> Google Toolbox for Mac: iPhone Unit Testing

RSpec样式

> Kiwi(它也带有嘲笑和预期)
> Cedar
> Jasmine with UI Automation,如dexterous’ iOS-Acceptance-Testing specs所示

Acceptance Testing

Selenium风格

> UI自动化(在设备上工作)

> UI Automation Instruments Guide
> UI Automation reference documentation
> Tuneup js – 使用UIAutomation的酷库。
> Capturing User Interface Actions into Automation Scripts

可以使用Cucumber (written in JavaScript)来驱动UI自动化。这将是一个伟大的开源项目。然后,我们可以编写Gherkin来运行UI自动化测试。现在,我只是写小鹿作为评论。

更新:Zucchini Framework似乎混合黄瓜& UI自动化! 🙂

老博客帖子:

> Alex Vollmer’s UI Automation tutorial
> O’Reilly Answers UI Automation tutorial
> Adi Saxena’s UI Automation tutorial

> UISpec with UISpecRunner

> UISpec is open source on Google Code
> UISpec has comprehensive documentation

> FoneMonkey

Cucumber样式

> FrankiCuke(基于Cucumber meets iPhone talk)

> Frank Google GroupiCuke Google Group有更多的活动。
> Frank在设备和模拟器上运行,而iCuke只在模拟器中运行。
>弗兰克似乎比iCuke’s step definitions有一套更全面的步骤定义。和,Frank also has a step definition compendium on their wiki
> I proposed that we merge iCuke & Frank(类似于Merb& Rails的合并方式),因为它们有相同的共同目标:iOS的Cucumber。

> KIF (Keep It Functional) by Square
> Zucchini Framework使用Cucumber语法进行测试,并使用CoffeeScript进行步骤定义。

添加

> OCMockmocking
> OCHamcrest和/或Expecta

结论

好吧,显然,这个问题没有正确的答案,但这里是我选择与目前去:

对于单元测试,我曾经在XCode 4中使用OCUnit/SenTestingKit。固体。但是,我更喜欢BDD的语言在TDD(Why is RSpec better than Test::Unit?),因为我们的话创造我们的世界。所以现在,我使用Kiwi with ARC&我更喜欢Kiwi对Cedar,因为它建立在OCUnit的顶部,并配有RSpec风格的匹配器& mocks / stubs。更新:我现在正在研究OCMock,因为,目前,Kiwi doesn’t support stubbing toll-free bridged objects

对于验收测试,我使用UI自动化,因为它真棒。它允许您记录每个测试用例,使写入测试自动。此外,苹果开发它,因此它有一个有希望的未来。它也适用于设备和仪器,允许其他酷功能,如显示内存泄漏。不幸的是,使用UI自动化,我不知道如何运行Objective-C代码,但是Frank& iCuke你可以。所以,我只是测试较低级别的Objective-C的东西与单元测试,或创建UIButtons只为TEST build configuration,当点击,将运行Objective-C代码。

您使用哪些解决方案?

相关问题

> Is there a BDD solution that presently works well with iOS4 and Xcode4?
> SenTestingKit (integrated with XCode) versus GHUnit on XCode 4 for Unit Testing?
> Testing asynchronous code on iOS with OCunit
> SenTestingKit in Xcode 4: Asynchronous testing?
> How does unit testing on the iPhone work?

最佳答案
tl; dr

在Pivotal,我们写了Cedar,因为我们在Ruby项目中使用和喜欢Rspec。雪松不是要替代或竞争OCUnit;这意味着将目标C的BDD风格测试的可能性,就像Rspec开创了在Ruby中的BDD风格测试,但没有消除Test :: Unit。选择一个或另一个主要是风格偏好的问题。

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

答案很长

在两个测试框架(如Cedar和OCUnit)之间进行决定(例如)归结为两个事情:首选风格和易用性。我将从风格开始,因为这只是一个意见和偏好的问题;易于使用往往是一组权衡。

样式注意事项超越了您使用的技术或语言。 xUnit风格单元测试已经远远长于BDD风格测试,但后者已迅速普及,主要是由于Rspec。

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

与xUnit风格相比,BDD风格框架往往有两个主要区别:如何构造测试(或规范),以及用于编写断言的语法。对我来说,结构差异是主要的区别。 xUnit测试是一维的,一个setUp方法用于给定测试类中的所有测试。然而,我们测试的类不是一维的;我们经常需要在几个不同的,潜在冲突的上下文中测试动作。例如,考虑一个简单的ShoppingCart类,带有一个addItem:方法(为了这个答案,我将使用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, ^{
            ...
        });
    });
});

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

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

这导致使用方便的问题。在这种情况下,每个框架都有其优点和缺点:

> OCUnit已经远远超过Cedar,并直接集成到Xcode。这意味着制作新的测试目标很简单,而且大多数时候,测试启动并运行“只是工作”。另一方面,我们发现在某些情况下,如在iOS设备上运行,让OCUnit测试工作几乎是不可能的。设置Cedar规范比OCUnit测试需要更多的工作,因为你已经得到库和链接自己(从来不是一个微不足道的任务在Xcode)。我们正在努力使安装更容易,任何建议都是欢迎。
> OCUnit作为构建的一部分运行测试。这意味着您不需要运行可执行文件来运行测试;如果任何测试失败,您的构建失败。这使得运行测试的过程更简单一步,测试输出直接进入您的构建输出窗口,这使得它很容易看到。我们选择将Cedar规范构建到可执行文件中,您可以单独运行这些文件,原因如下:

>我们想要能够使用调试器。您运行Cedar规范就像运行任何其他可执行文件一样,因此您可以以相同的方式使用调试器。
>我们希望在测试中轻松地记录控制台。您可以在OCUnit测试中使用NSLog(),但输出将进入构建窗口,您必须展开构建步骤才能读取它。
>我们希望在命令行和Xcode中轻松阅读测试报告。 OCUnit结果在Xcode的构建窗口中很好地显示,但是从命令行(或作为CI过程的一部分)构建会导致测试输出与大量其他构建输出混合。使用单独的构建和运行阶段Cedar分离输出,所以测试输出很容易找到。默认的Cedar测试运行器复制标准打印样式“。对于每个通过的规格,“F”为失败的规格等。雪松还有能力使用自定义记者对象,所以你可以让它输出结果任何方式你喜欢,用一点努力。

> OCUnit是Objective C的官方单元测试框架,受苹果支持。苹果基本上是无限的资源,所以如果他们想要做的事情会做。毕竟,这是苹果的沙盒我们玩。然而,这个硬币的另一面是,苹果每天接收大约一个百万支持请求和错误报告。他们非常善于处理它们,但他们可能无法处理您立即报告的问题,或者根本无法处理。 Cedar比OCUnit更新,更少烤,但如果你有问题或问题或建议发送消息到Cedar邮件列表(cedar-discuss@googlegroups.com),我们将尽我们可以帮助你。此外,随时从Github分支代码(github.com/pivotal/cedar),并添加你认为丢失的任何东西。我们使我们的测试框架开源的原因。
>在iOS设备上运行OCUnit测试可能很困难。老实说,我没有尝试过相当一段时间,所以它可能会变得更容易,但最后一次我尝试我根本无法获得OCUnit测试任何UIKit功能工作。当我们写Cedar时,我们确保我们可以在模拟器和设备上测试UIKit相关的代码。

最后,我们为单元测试写了Cedar,这意味着它不像UISpec这样的项目。从我尝试使用UISpec已经有一段时间了,但我理解它主要集中于在iOS设备上以编程方式驱动UI。我们特别决定不尝试让雪松支持这些类型的规范,因为苹果(当时)即将宣布UIAutomation。

转载注明原文:iphone – iOS测试/规格TDD/BDD和集成与验收测试 - 代码日志