热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

基于iOS版本的条件单元测试-ConditionalunittestingbasedoniOSversion

MyunittestsuitecontainsafewtestcasesthatareonlyapplicableforthelatestiOSversion.Ex

My unit test suite contains a few test cases that are only applicable for the latest iOS version. Expectedly, these tests fail when running the suite on an older iOS version.

我的单元测试套件包含一些仅适用于最新iOS版本的测试用例。预计,在较旧的iOS版本上运行套件时,这些测试会失败。

Is there a standard way to indicate that these test cases should run on a specific iOS version only?

是否有标准方法来指示这些测试用例应仅在特定的iOS版本上运行?

One option I thought about:

我想到的一个选择:

- (void) testSomethingThatOnlyWorksOniOS7
{
    const BOOL iOS7OrHigher = floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1;
    if (!iOS7OrHigher) return;

    // Actual test goes here
}

Alternatively, could I tell SenTestCase to skip certain tests dynamically?

或者,我可以告诉SenTestCase动态跳过某些测试吗?

4 个解决方案

#1


4  

Your approach seems fine to me.

你的方法对我来说似乎很好。

Generally speaking, I do not think that there is something like a "standard way" to selectively execute unit tests based on iOS version.

一般来说,我认为没有像“标准方式”那样有选择地执行基于iOS版本的单元测试。

On the one hand, your approach is the same that can be used to implement one feature selectively or in different ways according to iOS version. Possibly you already know about this discussion on CocoaWithLove: Tips and Tricks from conditional.... It's pretty old, but the approaches described here to hold still.

一方面,根据iOS版本,您的方法可以用于有选择地或以不同方式实现一个功能。可能你已经知道关于CocoaWithLove的讨论了:有条件的提示和技巧......它已经很老了,但是这里所描述的方法仍然存在。

You do not specify the way your unit tests are executed, but the real cool way to handle this, IMO, would be to be able to specify which tests to execute outside of the implementation, so that you state which ones are for iOS7 only and do not pollute your test implementation.

你没有指定单元测试的执行方式,但处理这个问题的真正酷的方法是IMO,它能够指定在实现之外执行哪些测试,以便你说明哪些只适用于iOS7,不要污染你的测试实现。

This could done, e.g., through a version number associated to each test; before calling the unit test implementation you check the version number in the function calling, e.g., testSomethingThatOnlyWorksOniOS7.

这可以通过例如与每个测试相关联的版本号来完成;在调用单元测试实现之前,请检查函数调用中的版本号,例如testSomethingThatOnlyWorksOniOS7。

EDIT:

编辑:

Actually, things could be easier that what I thought in the first place. Now I am going a bit hacky...

实际上,事情可能比我想到的更容易。现在我有点hacky ......

You could modify the place in OCUnit where the actual test method call is done (no idea about this, sorry, but I do not think it should be hard to find out...) so that it checks on the selector name: you convert the selector name into a string (NSStringFromSelector) and if it matches some regular expression, you take some specific branch (which would simply be in your case, ignoring that test).

您可以在OCUnit中修改实际测试方法调用的地方(不知道这个,对不起,但我不认为应该很难找到...)以便它检查选择器名称:您转换将选择器名称转换为字符串(NSStringFromSelector),如果它匹配某个正则表达式,则需要一些特定的分支(在您的情况下,这将忽略该测试)。

If you are worried by modifying OCUnit, which might not be sensible, what I said above could be done through method swizzling: only if the selector name does not match your expression, you call the original implementation, otherwise do nothing.

如果您担心修改OCUnit,这可能不合理,我上面所说的可以通过方法调配来完成:只有当选择器名称与您的表达式不匹配时,才调用原始实现,否则什么都不做。

#2


3  

The best way is to run respondsToSelector: on a method you know is only available on iOS 7. E.g.

最好的方法是运行respondsToSelector:在一个你知道的方法只能在iOS 7上运行。

[view respondsToSelector:@selector(snapshotViewAfterScreenUpdates:)]

or

要么

[UIView instancesRespondToSelector:@selector(snapshotViewAfterScreenUpdates:)]

#3


1  

There is not a standard way of doing this, and generally speaking testing is not something the iOS community talks too much about. The way I would approach this is by putting specific iOS7 tests on a test target on its own and then basically decide to run that suite accordingly

没有一种标准的方法可以做到这一点,一般而言,测试不是iOS社区过多谈论的内容。我接近这个的方法是将特定的iOS7测试单独放在测试目标上,然后基本上决定相应地运行该套件

#4


0  

I tried playing around with OCUnit as @sergio suggested but I couldn't get far away. So far I'm annotating version-specific tests with a macro. It looks like this:

我试着和OCUnit一起玩@sergio建议,但我无法远离。到目前为止,我正在使用宏来注释特定于版本的测试。它看起来像这样:

#define SKIP_IF_VERSION(v) if (floor(NSFoundationVersionNumber) <= v) return;

- (void)testSomethingThatOnlyWorksOniOS7
{ SKIP_IF_VERSION(NSFoundationVersionNumber_iOS_6_1)
// Test goes here
}

What I don't like about this approach is that the test runs anyway (and doesn't do anything). I would prefer the test to be skipped entirely.

我不喜欢这种方法是测试运行无论如何(并没有做任何事情)。我宁愿完全跳过测试。


推荐阅读
  • 本文探讨了Android系统中联系人数据库的设计,特别是AbstractContactsProvider类的作用与实现。文章提供了对源代码的详细分析,并解释了该类如何支持跨数据库操作及事务处理。源代码可从官方Android网站下载。 ... [详细]
  • 我在尝试将组合框转换为具有自动完成功能时遇到了一个问题,即页面上的列表框也被转换成了自动完成下拉框,而不是保持原有的多选列表框形式。 ... [详细]
  • UVa 11683: 激光雕刻技术解析
    自1958年发明以来,激光技术已在众多领域得到广泛应用,包括电子设备、医疗手术工具、武器等。本文将探讨如何使用激光技术进行材料雕刻,并通过编程解决一个具体的激光雕刻问题。 ... [详细]
  • 使用R语言进行Foodmart数据的关联规则分析与可视化
    本文探讨了如何利用R语言中的arules和arulesViz包对Foodmart数据集进行关联规则的挖掘与可视化。文章首先介绍了数据集的基本情况,然后逐步展示了如何进行数据预处理、规则挖掘及结果的图形化呈现。 ... [详细]
  • 使用 Babylon.js 实现地球模型与切片地图交互(第三部分)
    本文继续探讨在上一章节中构建的地球模型基础上,如何通过自定义的 `CameraEarthWheelControl` 类来实现更精细的地图缩放控制。我们将深入解析该类的实现细节,并展示其在实际项目中的应用。 ... [详细]
  • 在AngularJS中,有时需要在表单内包含某些控件,但又不希望这些控件导致表单变为脏状态。例如,当用户对表单进行修改后,表单的$dirty属性将变为true,触发保存对话框。然而,对于一些导航或辅助功能控件,我们可能并不希望它们触发这种行为。 ... [详细]
  • 本文详细介绍了如何使用Linux下的mysqlshow命令来查询MySQL数据库的相关信息,包括数据库、表以及字段的详情。通过本文的学习,读者可以掌握mysqlshow命令的基本语法及其常用选项。 ... [详细]
  • 本文探讨了如何使用Scrapy框架构建高效的数据采集系统,以及如何通过异步处理技术提升数据存储的效率。同时,文章还介绍了针对不同网站采用的不同采集策略。 ... [详细]
  • SSE图像算法优化系列三:超高速导向滤波实现过程纪要(欢迎挑战)
    自从何凯明提出导向滤波后,因为其算法的简单性和有效性,该算法得到了广泛的应用,以至于新版的matlab都将其作为标准自带的函数之一了&#x ... [详细]
  • HDU 2537 键盘输入处理
    题目描述了一个名叫Pirates的男孩想要开发一款键盘输入软件,遇到了大小写字母判断的问题。本文提供了该问题的解决方案及实现方法。 ... [详细]
  • 个人博客:打开链接依赖倒置原则定义依赖倒置原则(DependenceInversionPrinciple,DIP)定义如下:Highlevelmo ... [详细]
  • 本文由公众号【数智物语】(ID: decision_engine)发布,关注获取更多干货。文章探讨了从数据收集到清洗、建模及可视化的全过程,介绍了41款实用工具,旨在帮助数据科学家和分析师提升工作效率。 ... [详细]
  • 探讨了在Ionic3项目中,使用`ionic serve`命令可以正常运行,但使用`ionic build --prod`命令进行生产构建时遇到错误的原因及解决方案。 ... [详细]
  • 题目描述:Balala Power! 时间限制:4000/2000 MS (Java/Other) 内存限制:131072/131072 K (Java/Other)。题目背景及问题描述详见正文。 ... [详细]
  • Gradle 是 Android Studio 中默认的构建工具,了解其基本配置对于开发效率的提升至关重要。本文将详细介绍如何在 Gradle 中定义和使用共享变量,以确保项目的一致性和可维护性。 ... [详细]
author-avatar
超级无敌智慧星在路上
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有