MPWTest:通过超越Xunit模型来减少测试摩擦

2020-06-02 07:14:58

应大众需求,快速介绍MPWTest(“可能工作的最简单的测试框架”),这是我自己的个人单元测试框架,以及它如何使TDD变得快速、有趣和顺畅。我之所以创建MPWTest,是因为一旦我被TDD bug咬了一口,如果我能帮上忙的话,我肯定再也不想在没有TDD的情况下编写软件了。这是在XCTest之前很久,甚至它的递归器SenTestKit充其量也只是在并行开发中,我肯定没有意识到这一点。它有一点不同,这些不同之处使它足够好,我更喜欢它而不是我使用过的xUnit变体(JUnit、Sunit、XCTest)。所有这些都比不做TDD要好得多,但它们引入了大量的开销和摩擦,使得测试体验比需要的要麻烦得多,对我来说,至少在一定程度上解释了我看到的开发人员对单元测试的一些反感。我看到的态度是,考试就像吃蔬菜一样,你知道它应该对你有好处,你会勉强去做,但它真的很烦人,好处更多的是你在智力上知道的东西。对于我在MPWTest工作的我来说,TDD在智力上也是一件好事™,但从内心来说也很有趣,不太像蔬菜,更像是美味的零食,只是那些零食不仅好吃,而且健康。它帮助我跟上潮流,把事情做好。我会是MPWTest的第二名。请注意,我不知道它通常是如何完成的-但事实是所有内容都在一个文件中&;&;是构建过程的一部分,这使得它变得更快。考虑到SwiftUI的出现,它就像Xcode预览版--只是为了测试。1/。

--𝔾𝕦𝕤𝕥𝕒𝕧𝕠𝕄𝕦𝕔𝕙𝕠𝕃𝕠𝕧𝕖👌🏻(@LongMuchoLove)2020年5月28日。

它的作用是让我快速而安全地更改代码,这是敏捷的关键:与您在敏捷文献中可能读到的相反,敏捷的关键是快速而安全地更改代码的能力。关键是能够快速有效地重新测试代码。快速运行的自动化测试(单元测试)是敏捷性的关键。

-杰森·戈尔曼(Jason Gorman)(仅限,比往常更多的室内活动)(@jasongorman)2020年4月18日。

下面是它的工作原理。首先,您需要构建MPWTest项目的测试记录器二进制文件。我把我的放在/usr/local/bin中,然后就忘了它。你可以把它放在你喜欢的任何地方,但在接下来的过程中必须调整路径。接下来,将脚本构建阶段添加到您的(框架)项目中。MPWTest目前只测试框架。tester=/usr/local/bin/testloggerframework=${TARGET_BUILD_DIR}/${FULL_PRODUCT_NAME}if[-f${tester}];然后$tester${framework}否则回显";项目文件:0:1:警告:$tester或$framework未找到,测试未运行";fi。

然后,项目的构建阶段窗格的底部应该大致如下所示:没有单独的测试包,没有额外的目标,什么都没有。当您只有一个目标时,这可能看起来不是什么大不了的事情,但是一旦您开始拥有几个框架,为每个框架增加一个额外的测试目标就开始变得越来越重要。并且添加了一个决策点:我真的应该为这个项目创建一个额外的测试包吗?也许我可以改变一下现有的这个?在要测试的类中,添加+(NSArray*)testSelectors方法,返回要运行的测试/要执行的测试方法的列表。这里有一个JSON解析器的示例,我一直在写:+testSelectors{return@[@";testParseJSONString";,@";testParseSimpleJSONDict";,@";testParseSimpleJSONArray";,@";testParseWritals";,@";testParseNumbers";,@";testParseNumbers";,@"。,@";testUnicodeEscapes";,@";testCommonStrings";,@";testSpaceBeforeColon";,];}。

您也可以自动确定这些名称,但我更喜欢将显式列表作为规范的一部分:这些是应该运行的测试。否则,很容易就会因为编辑错误而输掉一次测试,而不会因此而变得更加明智。然后只需执行一个测试,例如testUnicodeEscapes:+(Void)testUnicodeEscapes{MPWMASONParser*parser=[MPWMASONParser parser];NSData*json=[self frame Resource:@";unicodeEscapes";class:@";json";];NSArray*array=[parser parsedData:json];NSString*first=。IDEXPECT([array objectAtIndex:1],@";\n";,@";Second is newline";);}。

是的,这大部分是旧代码。宏的作用与您的预期不谋而合:INTEXPECT()期望整数相等(老实说,或者其他标量),IDEXPECT()期望对象相等。对于nil、非nil、true和false也有一些便利,还有一个专门的用于浮点数的函数,它设置了一个可接受的范围。从理论上讲,你可以