Xcode 4:从命令行(xcodebuild)运行测试?

2024-03-07

我在 Xcode 4 中创建了一个全新的 iOS 项目,并包含单元测试。默认应用程序有 2 个目标,主应用程序和单元测试包。使用“产品 > 测试”(Command-U) 构建应用程序、构建单元测试包、启动 iOS 模拟器并运行测试。现在我希望能够从命令行执行同样的操作。命令行工具(xcodebuild)没有“测试”操作,但似乎我应该能够直接构建单元测试包目标,因为它取决于应用程序本身。但是,运行:

xcodebuild -target TestAppTests -sdk iphonesimulator4.3 -configuration Debug build

给出以下消息:

/Developer/Platforms/iPhoneSimulator.platform/Developer/Tools/Tools/RunPlatformUnitTests:95: warning: Skipping tests; the iPhoneSimulator platform does not currently support application-hosted tests (TEST_HOST set).

这似乎是一个谎言,因为当我从 GUI 运行 Command-U 时,测试主机已设置为我的单元测试包目标。我之前看过有关逻辑测试和应用程序测试之间分离的文章,但 Xcode 4 似乎消除了这种区别。有什么线索可以让我从命令行运行测试吗?


重要的提示

使用 Xcode 5.1(也许还有更早的 Xcode)test是一个有效的构建操作。

我们能够使用 test 的构建操作并使用适当的方法通过调用 xcodebuild 来替换下面的整个 hack-destination选项。man xcodebuild了解更多信息。

以下信息留在这里供后代使用


我尝试破解苹果的脚本来运行单元测试,如中所述

从命令行运行 Xcode 4 单元测试 http://blog.carbonfive.com/2011/04/06/running-xcode-4-unit-tests-from-the-command-line/

and

Xcode4:在 iOS 中从命令行运行应用程序测试 http://longweekendmobile.com/2011/04/17/xcode4-running-application-tests-from-the-command-line-in-ios/

以及网络上无数类似的帖子。

但是,我在这些解决方案中遇到了问题。我们的一些单元测试使用了 iOS 钥匙串,当在来自破解 Apple 脚本的环境中运行时,这些调用失败并出现错误(errSecNotAvailable[-25291] 对于病态的好奇者)。结果,测试总是失败……这是测试中不受欢迎的功能。

我根据在网络上其他地方找到的信息尝试了多种解决方案。例如,其中一些解决方案涉及尝试启动 iOS 模拟器的安全服务守护进程。在与这些问题作斗争之后,我最好的选择似乎是在 iOS 模拟器中运行,并充分利用模拟器环境的优势。

然后我所做的就是找到 iOS Simulator 启动工具ios-sim https://github.com/pegli/ios-sim。该命令行工具使用私有 Apple 框架从命令行启动 iOS 应用程序。然而,对我来说特别有用的是,它允许我将环境变量和命令行参数传递给它正在启动的应用程序。

通过环境变量,我能够将单元测试包注入到我的应用程序中。通过命令行参数,我可以传递让应用程序运行单元测试并退出所需的“-SenTest All”。

我为我的单元测试包创建了一个方案(我称之为“CommandLineUnitTests”),并检查了构建部分中的“运行”操作,如上面的帖子中所述。

不过,我并没有破解 Apple 的脚本,而是用使用 ios-sim 启动应用程序的脚本替换了该脚本,并设置了环境以将我的单元测试包单独注入到应用程序中。

我的脚本是用 Ruby 编写的,我比 BASH 脚本更熟悉它。这是该脚本:

if ENV['SL_RUN_UNIT_TESTS'] then
    launcher_path = File.join(ENV['SRCROOT'], "Scripts", "ios-sim")
    test_bundle_path= File.join(ENV['BUILT_PRODUCTS_DIR'], "#{ENV['PRODUCT_NAME']}.#{ENV['WRAPPER_EXTENSION']}")

    environment = {
        'DYLD_INSERT_LIBRARIES' => "/../../Library/PrivateFrameworks/IDEBundleInjection.framework/IDEBundleInjection",
        'XCInjectBundle' => test_bundle_path,
        'XCInjectBundleInto' => ENV["TEST_HOST"]
    }

    environment_args = environment.collect { |key, value| "--setenv #{key}=\"#{value}\""}.join(" ")

    app_test_host = File.dirname(ENV["TEST_HOST"])
    system("#{launcher_path} launch \"#{app_test_host}\" #{environment_args} --args -SenTest All #{test_bundle_path}")
else
    puts "SL_RUN_UNIT_TESTS not set - Did not run unit tests!"
end

从命令行运行它看起来像:

xcodebuild -sdk iphonesimulator -workspace iPhoneApp.xcworkspace/ -scheme "CommandLineUnitTests" clean build SL_RUN_UNIT_TESTS=YES

寻找之后SL_RUN_UNIT_TESTS环境变量,脚本在项目的源代码树中找到“启动器”(iOS-sim 可执行文件)。然后,它根据 Xcode 在环境变量中传递的构建设置构建单元测试包的路径。

接下来,我为正在运行的应用程序创建一组运行时环境变量,以注入单元测试包。我在中设置了这些变量environmenthash 在脚本中间,然后使用一些 ruby​​ grunge 将它们加入到一系列命令行参数中ios-sim应用。

在底部附近我抓住了TEST_HOST从环境中作为我想要启动的应用程序和system命令实际执行ios-sim传递应用程序、设置环境的命令参数以及参数-SenTest All以及正在运行的应用程序的测试包路径。

这个方案的优点是它在模拟器环境中运行单元测试,就像我相信 Xcode 本身所做的那样。该方案的缺点是它依赖于外部工具来启动应用程序。该外部工具使用私有 Apple 框架,因此在后续操作系统版本中它可能会很脆弱,但目前可以使用。

附:出于叙述原因,我在这篇文章中多次使用“我”,但很大程度上要归功于我的犯罪伙伴 Pawel,他和我一起解决了这些问题。

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

Xcode 4:从命令行(xcodebuild)运行测试? 的相关文章

  • 二元运算符“/”不能应用于两个(Int)操作数[重复]

    这个问题在这里已经有答案了 我得到了Binary operator cannot be applied to two Int operands当我将以下代码放入 Xcode 中的 Swift Playground 时出错 func sumO
  • 在 github 上下载 ZIP 时没有 .xcodeproj 文件

    我正在尝试将我的 GitHub 项目放入 Xcode 中 当我从 GitHub 下载时 zip 文件不包含任何 xcodeproj 文件 另外 即使我在 xcode 上登录 GitHub 克隆 下载时也没有 在 Xcode 中打开 选项 如
  • 当 ViewController 从 UIStoryboard 实例化时,isMemberOfClass 返回 no

    我有一个 OCUnit 测试类 PatientTestViewControllerTests 下面是界面 interface PatientTestViewControllerTests SenTestCase property nonat
  • Spark scala 模拟 Spark.implicits 用于单元测试

    当尝试使用 Spark 和 Scala 简化单元测试时 我使用 scala test 和mockito scala 以及mockito Sugar 这只是让你做这样的事情 val sparkSessionMock mock SparkSes
  • 寻找网站测试自动化的方法

    我们开发定制调查网站 我正在寻找一种方法来自动化这些网站的模式测试 调查通常包含许多复杂的规则和分支 这些规则和分支也会根据项目的响应方式而触发 所有调查在发布给客户之前都经过严格测试 此测试需要大量的手动工作 我想了解一些可以通过回答问题
  • 删除派生数据文件夹后,Xcode 不断重新创建派生数据文件夹

    自动完成功能在 Xcode 6 中不再起作用 我四处搜索 发现删除派生数据文件夹可以解决此问题 每次我删除它时 它都会回来 然后就不会再自动完成了 有什么建议么 Thanks 没关系 我解决了这个问题 我没有声明需要在类内的方法中使用的变量
  • FakeAsync/tick (Async/whenStable) 与 detectorChanges()

    您能帮我区分这两件事吗 根据我的理解 如果你只使用 observable 你可以使用 detectorChanges 因此 您可以直接更改组件属性或监视服务调用并返回可观察的值 然后调用 detectorChanges 更改将在 html
  • 在 Xcode4 中使用 Boost

    有人设置 C Xcode4 项目来使用 Boost 吗 对于一个简单的 C 控制台应用程序 我需要在 Xcode 中设置哪些设置 Thanks 用这个来管理它 和这个
  • AWS S3 公共对象与私有对象?

    回到 S3 我的存储桶中有图像的 URL 我将在我的应用程序中呈现这些图像 但它们被设置为私有 当我尝试单击该链接时 它显示 访问被拒绝 当我将链接的设置更改为公共时 它会通过 但是我读到公共访问并不是最安全的事情 所以这本质上是一个由两部
  • 通过 Web 界面执行 python 单元测试

    是否可以通过 Web 界面执行单元测试 如果可以 如何执行 EDIT 现在我想要结果 对于测试 我希望它们是自动化的 可能每次我对代码进行更改时 抱歉我忘了说得更清楚 EDIT 这个答案此时已经过时了 Use Jenkins https j
  • Xcode 调试器 - 如何在 CPU 指令级别单步执行

    这绝对是令人着迷的 但我对编译器如何巧妙地将 C 代码转换为机器指令感到着迷 由于我对某些指令有点模糊 因此如果我能够在单个机器指令级别 低于 C 语句级别 可能会生成多个 CPU 指令 观察已编译程序的操作 将会很有帮助 换句话说 我可以
  • 在带有 Storyboard 的 XCode 4 中以模态方式推送视图时,出现“对开始/结束外观转换的不平衡调用”警告

    在网上进行了一些研究但没有成功后 我来这里向您询问有关我的警告的问题 实际上 我有一个带有导航控制器的视图 V1 我想在 V1 完成加载时推送模态视图 V2 所以我用performSegueWithIdentifier方法 我正在使用故事板
  • 缺少常规选项卡

    我刚刚切换到使用 Xcode 5 我已经用一些需要更改的其他设置更改了我的应用程序的名称 但是当我执行此操作时 我注意到我的 常规 选项卡丢失了 有谁知道为什么会发生这种情况 只是快速更新如何在 Xcode 8 中执行此操作
  • 个人帐户开发者之间的 Apple 开发/分发证书

    我一直在到处寻找有关处理证书的正确答案 想象一下以下帐户 Joe拥有个人 Apple 帐户 但他根本不会编码 他只是发布了该应用程序并将其称为自己的 Bob还有一个个人 Apple 帐户 Bob 是一位编码专家 Joe 付费让他开发他的第一
  • 模拟对象 - 将所有方法声明为虚拟方法还是使用接口?

    与 Java 不同 net 中的方法默认不是虚拟的 为了使用大多数模拟对象框架 您要么必须将要在模拟上使用的方法标记为 真实 对象上的虚拟方法 要么必须有一个可以模拟被测试类将使用的接口接受代替执行 将每个方法标记为虚拟似乎是一种不好的形式
  • ui 测试 xcode,如何使用 cellquery 点击表视图单元格按钮

    我目前正在为我的应用程序进行 ui 测试 并一直点击我的应用程序的登录按钮 我无法找到我提供了标识符注册按钮的元素 该元素是索引中的第三个 这不是问题 let cellQuery self app tables cells element
  • 如何测试 UITextField 是否为零?

    我正在尝试制作我的应用程序的一部分 如果该人不更改我的 UITextField 中的空白文本 那么他 她将无法继续下一步 基本上 我想测试 UITextField 的 nil 文本 我已经使用了 if text 方法 但是如果用户单击 UI
  • spring boot 使用哪个“切片”来测试服务组件

    我正在使用 spring boot 开发一个rest api 它由标准层组成 控制器 RestController 处理传入的http请求并公开api端点 然后是服务层 Service 最后是存储库层 Repository 我的问题是关于单
  • 无法将“SDWebImageActivityIndi​​cator”类型的值分配给“ST_SDWebImageIndicator”类型?

    I have multiple flavours targets in my Xcode project I am also using SDWebImage in my app Everything was working fine un
  • “同时创建 xib 文件”按钮已禁用

    我在创建时遇到这个问题UIView s子类 创建 例如 UIViewControllers or UITableViewCells没关系 为什么会出现这种情况 I create view using cmd N and Xcode Vers

随机推荐

  • 相关非类型模板参数

    考虑下面的类 class Foo enum Flags Bar Baz Bax template
  • 如何在 Java 中配置数据源以连接到 MS SQL Server?

    我正在尝试按照 Java 的 JDBC 教程编写一个可以连接到 SQL Server 2008 的 Java 程序 在建立连接时我迷失了方向 以下片段来自教程 InitialContext ic new InitialContext Dat
  • 如何在 Windows Azure 中连接 2 个虚拟机以实现两层架构?

    如何在 Windows Azure 中创建 2 个连接的虚拟机以便能够部署两层架构解决方案 让我澄清一下这个场景 目前我在 Windows Azure 中使用 1 个虚拟机 其中安装了 SQL Server 2008 DB 和 ASP NE
  • 何时使用动态库与静态库

    在 C 中创建类库时 可以选择动态 dll so 和静态 lib a 图书馆 它们之间有什么区别 什么时候适合使用哪个 静态库会增加二进制文件中代码的大小 它们总是被加载 并且无论您编译的代码版本是什么 都是将运行的代码版本 动态库单独存储
  • 如何从 silverlight 应用程序检测操作系统?

    我有一个 Silverlight3 应用程序 旨在在 Windows 和 Mac OS 环境上运行 我想在运行时知道我的应用程序是在 Windows 还是 Mac 上运行 这样我就可以根据用户在他们选择的操作系统中习惯的方式进行一些调整 例
  • 在 CodeIgniter 2.0 中返回并使用数据库中的多维记录数组

    大家好 好吧 我正在尝试使用 codeigniter 但在我看来 我在尝试检索和显示表中的数据时造成了一些混乱 这是代码片段 我想检索存储在我的文章表中的所有文章 同时我需要从关系表和分别名为articleTagRelation和标签的标签
  • 重新连接 WebSocket 而不创建新实例

    因此 我创建了一个新的 Web 应用程序 它使用 WebSocket 到 Node JS WebSocket 服务器 现在 节点服务器可以完成它需要的一切并且工作完美 我的问题是浏览器的实现 我查看了答案中其他人提供的许多库 但我想看看它们
  • 如何使用LINQ选择对象?

    我的数据看起来像这样 UserId SongId 1 1 1 4 1 12 2 95 我还有以下课程 class SongsForUser public int User public List
  • 滑动菜单未正确显示

    我是一名初学者 Android 程序员 我正在玩弄JFeinstein 很棒的滑动菜单 https github com jfeinstein10 SlidingMenu 试图弄清楚它是如何工作的并在我的应用程序中实现它 但在我的所有实现中
  • 从 ASCII 文件读取文本值到 matlab 变量中

    考虑以下文件 var1 var2 variable3 1 2 3 11 22 33 我想将数字加载到矩阵中 并将列标题加载到变量中 该变量相当于 variable names char var1 var2 variable3 我不介意将名称
  • 我可以将反应组件放入状态中吗?

    找不到任何最近的官方信息是否允许以下 三个选项中的任何一个 constructor props this state item
  • 具有类型约束的无符号“变量”是否可以重新绑定? [复制]

    这个问题在这里已经有答案了 EDIT 关闭以支持https stackoverflow com questions 69231506 what are the rules for re binding 这是我在更清楚地理解我在这个问题中想问
  • 在 PHP 中创建日、小时、分钟和秒倒计时

    到目前为止 我已经有了这个可以倒计时天和小时的脚本 但是如何让它也可以倒计时分钟和秒呢 remaining strtotime ActiveListing ListingExpires time days remaining floor r
  • Woothemes Flexslider - 另一个 Flexslider 中的一个独特的 Flexslider - 可能吗?

    我正在使用 Woothemes 的最新 Flexslider 并且我正在尝试将一个 FlexSlider 初始化到另一个 FlexSlider 中 像这样 function initFrontpageSliders flexsliderFr
  • Spring boot:在运行时添加新端点

    我正在开发一项功能 允许 Spring Boot 应用程序具有 插件 这意味着无需新的构建 应用程序就应该能够集成新的代码片段 动态类加载是可以的 但是 对于每个新的 插件 我需要添加一个新的休息端点 我知道一些库能够在 Spring Bo
  • 根据数组生成文件列表

    我尝试了一些事情 但这周我感觉我的大脑正在度假 我需要完成这件事 所以我希望有人可以帮助我 我需要根据保存到数据库中的哈希创建一个文件列表 看起来像这样 file1 dir1 file2 dir1 subdir1 file3 输出应该是这样
  • 如何在 Groovy 中重置模拟静态方法?

    我在测试设置中有以下内容 def originalPostAsXml RestClient postAsXml RestClient metaClass static postAsXml String uriPath String xml
  • 我可以在 Jenkinsfile 中增强 scm 吗?

    我花了很长时间才明白什么checkout scm真正的意思是在 Jenkinsfile 中 checkout 是一个函数 scm 是一个默认的全局变量 现在我明白了 我想补充一下scm例如 增加特定结账的超时时间或设置sparseCheck
  • YouTube 数据 API v3 - 评论线程请求不返回总结果计数

    当我执行以下 YouTube 数据 API 请求来列出 commentThreads 时 pageInfo totalResults未在响应中返回 我预计pageInfo totalResults待退回根据文档 https develope
  • Xcode 4:从命令行(xcodebuild)运行测试?

    我在 Xcode 4 中创建了一个全新的 iOS 项目 并包含单元测试 默认应用程序有 2 个目标 主应用程序和单元测试包 使用 产品 gt 测试 Command U 构建应用程序 构建单元测试包 启动 iOS 模拟器并运行测试 现在我希望