加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

objective-c – 在XCode 8中,在给定的XCTestCase类中以特定顺序

发布时间:2020-12-14 17:57:51 所属栏目:百科 来源:网络整理
导读:在XCode 8之前,您可以通过按字母顺序排列给定XCTestCase类中的测试方法的名称来使单元测试以特定顺序运行(如 this answer中所述).例如,测试将运行如:testA,testB,testC,testD等. 但是在XCode 8中,情况已不再如此.例如,我将首先运行名为test1,test2,test3,te
在XCode 8之前,您可以通过按字母顺序排列给定XCTestCase类中的测试方法的名称来使单元测试以特定顺序运行(如 this answer中所述).例如,测试将运行如:testA,testB,testC,testD等.

但是在XCode 8中,情况已不再如此.例如,我将首先运行名为test1,test2,test3,test4和test4的测试方法(参见下面的屏幕截图).然后我可以重新运行,test2将在下一次运行时首先运行.

enter image description here

那么……如何在XCode 8上按顺序运行测试…?

解决方法

所以我解决这个问题的方法如下.

问题回顾:

我需要连续运行几个测试:test1,test4.每个测试都建立了一个期望,测试的最后一步将满足预期,然后测试将结束,下一个测试将运行.

但是在XCode 8中,测试现在以随机顺序运行.虽然这是好的,但是,如果它们是单元测试,它们应该能够以随机顺序运行,如果它们不是作为单元测试而是作为端到端测试而设计,则会破坏您的测试.

例如,在我的情况下它打破了测试,因为在第一次测试中,用户登录并设置一些数据等.然后,第二个测试检查数学,然后第三个测试将数据同步到服务器,然后第四个测试将其全部删除并从服务器向下同步.当第一个测试运行时,在构建时,shell脚本从MSYQL文件进入服务器的DB,然后在应用程序启动时,AppDelegate为应用程序安装一个新的CoreData DB.因此,如果我必须在每次测试后重新启动应用程序,那么shell脚本将重新启动服务器数据库并导致应用程序的本地CoreData数据库也重新初始化.这将打破后续测试(它是一个端到端测试,后续测试依赖于应用程序和服务器的状态,在上一次测试运行后以某种方式).

而不是设置四个不同的CoreData启动数据库和四个不同的服务器初始化脚本(这将是一个巨大的痛苦,并使得每当我们有架构更改时管理的端到端测试成倍地耗费时间),或者必须记住运行而不是连续手动构建每个测试,而是使用以下策略将所有四种测试方法合并为一个非常长的测试方法.

首先,在XCTestCase类中,我设置了一个测试期望属性:

@property (nonatomic,strong) XCTestExpectation *endOfTestExpectation;

在我的XCTestCase类的test1结束时,我用这个新的期望替换了它的现有期望,如下所示:

self.endOfTestExpectation = [self expectationWithDescription:
                                  @"endOfTestExpectation"];

[self waitForExpectationsWithTimeout:900 
                             handler:^(NSError * _Nullable error) {
    /* Code moved from test4's expectation completion block goes here */
}

对于每个test1到test3,我将测试原始期望完成块内的代码移动到一个名为completion1到completion3的新方法中.对于test4,我将其原始期望完成块内的代码移动到test1方法结束时的endOfTestExpectation的完成块中.

然后我将方法test2重命名为test4,命名为t3st2到t3st4(快速而肮脏,我知道;你应该选择更具描述性的东西).在completion1方法结束时,我调用t3st2;在完成2结束时我打电话给t3st3;在完成3结束时我打电话给t3st4;在完成4结束时,我打电话给[self.endOfTestExpectation履行];.

这实际上最终比旧的方式更好,因为以旧方式,即使第一次测试失败,后续测试仍将运行!现在,无论XCTFail发生在哪里,整个事情就会停止,如果我被标记为SO:D,我们就不会浪费时间来运行其余的事情.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读