入门客AI创业平台(我带你入门,你带我飞行)
博文笔记

Xcode命令行执行单元测试

创建时间:2017-07-26 投稿人: 浏览次数:1259

在介绍xcodebuild之前,需要先弄清楚一些在XCode环境下的一些概念:
- Workspace:简单来说,Workspace就是一个容器,在该容器中可以存放多个你创建的Xcode Project, 以及其他的项目中需要使用到的文件。
使用Workspace的好处有:
(1)扩展项目的可视域,即可以在多个项目之间跳转,重构,一个项目可以使用另一个项目的输出。Workspace会负责各个Project之间提供各种相互依赖的关系;
(2)多个项目之间共享Build目录。
- Project:指一个项目,该项目会负责管理生成一个或者多个软件产品的全部文件和配置,一个Project可以包含多个Target。
- Target:一个Target是指在一个Project中构建的一个产品,它包含了构建该产品的所有文件,以及如何构建该产品的配置。
- Scheme:一个定义好构建过程的Target成为一个Scheme。可在Scheme中定义的Target的构建过程有:Build/Run/Test/Profile/Analyze/Archive
- BuildSetting:配置产品的Build设置,比方说,使用哪个Architectures?使用哪个版本的SDK?在Xcode Project中,有Project级别的Build Setting,也有Target级别的Build Setting。Build一个产品时一定是针对某个Target的,因此,XCode中总是优先选择Target的Build Setting,如果Target没有配置,则会使用Project的Build Setting。
弄清楚上面的这些概念之后,xcodebuild就很好理解了,官网上对其作用的描述如下:
xcodebuild builds one or more targets contained in an Xcode project, or builds a scheme contained in an Xcode workspace or Xcode project.
xcodebuild就是用了构建产品的命令行工具,其用法可以归结为3个部分:
• 可构建的对象
• 构建行为
• 一些其他的辅助命令
可以构建的对象有,默认情况下会运行project下的第一个target:
• workspace:必须和“-scheme”一起使用,构建该workspace下的一个scheme。
• project:当根目录下有多个Project的时候,必须使用“-project”指定project,然后会运行
• target:构建某个Target
• scheme:和“-workspace”一起使用,指定构建的scheme。
构建行为包括:
• clean:清除build目录下的
• build: 构建
• test: 测试某个scheme,必须和”-scheme”一起使用
• archive:打包,必须和“-scheme”一起使用
辅助命令包括:
• -sdk:指定构建使用的SDK
• -list:列出当前项目下所有的Target和scheme。
• -version:版本信息

2.1查看xcode的版本号和build版本

$xcodebuild –version
显示内容:
Xcode 9.0
Build version 9M137d

2.2显示当前系统的sdk及其版本

$xcodebuild -showsdks
显示内容:
iOS SDKs:
iOS 11.0 -sdk iphoneos11.0
iOS Simulator SDKs:
Simulator - iOS 11.0 -sdk iphonesimulator11.0
macOS SDKs:
macOS 10.13 -sdk macosx10.13
tvOS SDKs:
tvOS 11.0 -sdk appletvos11.0
tvOS Simulator SDKs:
Simulator - tvOS 11.0 -sdk appletvsimulator11.0
watchOS SDKs:
watchOS 4.0 -sdk watchos4.0
watchOS Simulator SDKs:
Simulator - watchOS 4.0 -sdk watchsimulator4.0

2.3显示工程项目信息

先cd到工程目录下(有*.xcodeproj的目录,比如CMBUnitAutoTestProject3.xcodeproj),然后输入命令:
$ xcodebuild –list
显示内容:
Information about project “CMBUnitAutoTestProject”:
Targets:
CMBUnitAutoTestProject
CMBUnitAutoTestProjectTests
CMBOCHamcrestTest
CMBOHHttpStubsTest
Build Configurations:
Debug
Release
If no build configuration is specified and -scheme is not passed then “Release” is used.
Schemes:
CMBFoundation
CMBUnitAutoTestProject
CMBFoundationUniversal
注:如果未指定Configurations,默认为release

2.4用模拟器建立工程

此处选择ios11.0模拟器(iphonesimulator11.0),输入命令:
$ xcodebuild -sdk iphonesimulator11.0
输出一堆编译过程,最后输出* BUILD SUCCEEDED 表示创建成功;若输出 BUILD FAILED *表示创建失败。成功后界面如下:

成功后会在当前工程目录下创建build目录,结构如下:
这里写图片描述
CMBUnitAutoTestProject.app就是编译生成的可执行文件,而CMBUnitAutoTestProject.build文件夹下是一些中间文件:
这里写图片描述

2.5设置成Debug模式

默认是Release工程,要设置成Debug模式如下:
$ xcodebuild -sdk iphonesimulator5.0 -configuration Debug

2.6 clean创建的工程

输入命令:
$ xcodebuild clean -sdk iphonesimulator5.0 -configuration Debug
clean成功之后成功输出CLEAN SUCCEEDED界面如下:
这里写图片描述

2.7运行unit test

执行测试用例需要的命令是xcodebuild test,如果直接运行,会报如下的错误:
这里写图片描述
从中我们可以了解到,需要在命令行中指定scheme参数,此外,根据官方文档的描述,我们还要根据scheme参数的配置情况,灵活设置destination参数。
如官网示例:
xcodebuild test -project MyAppProject.xcodeproj -scheme MyApp -destination ‘platform=OS X,arch=x86_64’
而在我的配置环境下
xcodebuild -scheme CMBUnitAutoTestProject -target CMBOHHttpStubsTest test -destination ‘platform=iOS,name=张楠的 iPhone’
-project在project当前目录下,且只有一个project文件,是可选参数,可以不写。

指定执行单个用例方法
模拟器
xcodebuild test -scheme FoundationUnitTestProject -target FoundationUnitTestProjectTests:NSString+ExtensionsTests -only-testing:FoundationUnitTestProjectTests/NSString+ExtensionsTests/testisAllWhiteSpaceInString -destination ‘platform=iOS,name=张的 iPhone’|xcpretty
真机
xcodebuild test -scheme FoundationUnitTestProject -target FoundationUnitTestProjectTests:NSString+ExtensionsTests -only-testing:FoundationUnitTestProjectTests/NSString+ExtensionsTests/testisAllWhiteSpaceInString -destination ‘platform=iOS Simulator,name=iPhone 7 Plus’|xcpretty

执行全部用例方法
真机
xcodebuild test -scheme FoundationUnitTestProject -target FoundationUnitTestProjectTests -destination ‘platform=iOS,name=张的 iPhone’|xcpretty
模拟器
xcodebuild test -scheme FoundationUnitTestProject -target FoundationUnitTestProjectTests -destination ‘platform=iOS Simulator,name=iPhone 7 Plus’|xcpretty

2.8 xcodebuild缺陷

xcodebuild的主要缺陷:
• 从上图直接可以得到的感觉,其脚本输出的可读性极差
• 只能要么完整的运行一个target或者scheme,要么全部不运行。不能指定运行Target中特定的测试。
XCode 4中的xcodebuild居然不支持iOSUnitTest的Target,当我尝试运行一个iOS App的测试target时,得到如下的错误:
这里写图片描述
对于上面提到的缺陷,Facebook给出了他们的解决方案:xctool。

2.9 遇到的问题

执行test的时候,必须指定scheme,但是有时候在list中并未显示完整的scheme列表,此时,需要在Xcode中进行设置:

这里写图片描述
随后,Schemes 管理页面:
这里写图片描述
将需要的scheme后的share勾上即可。

3.1 xctool目的

xctool在 其主页直接表明了其目的:
xctool is a replacement for Apple’s xcodebuild that makes it easier to build and test iOS and Mac products. It’s especially helpful for continuous integration.
其作用是替代xcodebuild,目的是让构建和测试更加容易,更好的支持持续集成。从个人感受来看,它的确成功取代了xcodebuild。但是xctool说到底只是对xcodebuild的一个封装,只是提供了更加丰富的build指令,因此,使用xctool的前提是xcodebuild已经存在,且能正常工作。

3.2 安装

xctool的安装非常简单,只需要clone xctool的repository到项目根目录就可以使用, 如果你的机器上安装有Homebrew,可以通过“brew install xctool”命令直接安装。(注意:使用xctool前一定要首先确认xcodebuild已安装且能正确工作)。
brew –list:查看安装的所有软件列表;
brew info xctool:查看xctool软件信息

3.3 使用

关于xctool的用法就更加人性化了,几乎可以重用所有的xcodebuild的指令,配置。只需要注意以下几点:
• xctool不支持target构建,只能使用scheme构建。
• 支持“-only”指令运行指定的测试。
• 支持多种格式的build报告。
例子:
path/to/xctool.sh -workspace YourWorkspace.xcworkspace -scheme YourSchemetest -only SomeTestTarget:SomeTestClass/testSomeMethod
关于xctool的使用,会在之后再详细介绍。

阅读更多
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。
  • 上一篇:没有了
  • 下一篇:没有了
未上传头像