iOS单元测试之测试计划TestPlan

1,050 阅读6分钟

一、测试计划简介

1.1、什么是测试计划?

**Xcode 测试计划提供了一种运行各种测试配置的测试选择的方法。**测试计划是一个带有.xctestplan扩展名的JSON文件,您可以将其添加到Xcode项目中,并从方案中引用。它有三个主要要素:

  • **测试目标:**一个或多个测试目标(单元或UI)。您不必在测试目标中运行所有测试。对于每个测试计划,您可以选择计划将运行的测试,以及测试是否可以并行运行。
  • **默认选项:**一组默认(共享)设置,可以被特定配置覆盖。这些是您通常在方案编辑器中找到的设置:启动参数、本地化设置、屏幕截图设置、文本执行(字母或随机)、运行时调试选项Sanitizer、线程检查器和malloc守卫。
  • **配置:**覆盖默认选项的一个或多个配置。测试计划对所选测试运行多次,每次对每种配置运行一次。

1.2、它们有什么好处?

测试计划的一些可能用途:

  • **使用不同的调试选项Sanitizer/诊断器运行测试:**您不能同时启用地址和线程调试选项Sanitizer进行测试。使用测试计划,我们可以创建两种配置,一种启用地址调试选项Sanitizer,另一种启用线程调试选项Sanitizer。运行测试计划,然后运行我们的测试两次,每种调试选项Sanitizer一次,以便使用malloc诊断程序运行。
  • **测试多个本地化:**为您支持的每种语言创建配置。您将应用程序语言和区域设置为配置的一部分。这也是为本地化程序生成屏幕截图的好方法。
  • **运行具有特定配置的选定测试:**例如,您不希望性能测试并行运行。
  • **不同的测试范围:**我喜欢在点击 Command + U 时默认运行一组快速测试。我还想要一套针对几种配置运行的全套单元、用户界面和性能测试。测试计划使设置变得容易得多。

二、新建测试计划

2.1、创建TestPlan

2.1.1、新建xctestplan文件

如下图所示新建TestPlan文件,命名ZJHUnitTestPlan,并保存在了 ZJHTestPlans目录中。也可以从Xcode菜单中:Product>Scheme>Convert Scheme to use Test Plans,新建TestPlan文件。

新建xctestplan文件.png

2.1.2、添加测试目标

选中Tests一栏,然后选择需要执行的单测用例

添加测试目标.png

2.1.3、默认设置和新配置

选择测试后,单击Configurations选项卡。新的测试计划具有共享(默认)设置和名为Configuration 1的单一配置。从共享设置开始。与默认设置不同的设置以粗体显示,我们把执行顺序更改为随机,并将Address Sanitizer改为On

默认设置和新配置.png

2.2、查看.xctestplan文件

可以如下图所示,查看我们刚刚新建的.xctestplan文件

查看.xctestplan文件.png

2.3、配置Scheme并运行

为了和之前的Scheme做区分,我这边copy了一个新的Scheme:ZJHUnitTestDemoTestPlan。 然后在Test部分中,单击Convert to use Test Plans…

单击Convert to use Test Plans….png

在出现的弹出窗口中,选择Choose Test Plan,然后单击Convert…(也可以选择Create empty test plan,重建个新的)。然后选择ZJHUnitTestPlan.xctestplan,然后点击Add

选择Test Plan.png

之后,按Command-U运行测试并查看Test navigator,您会看到,在新的测试计划中,只有选择的测试用例才会执行。

查看TestPlan执行结果.png

三、使用场景示例

3.1、示例准备

准备一个页面,支持中文简体、中文繁体,以及英文,然后计划在中国大陆、中国台湾、美国上线。点击下载Demo:ZJHUnitTestDemo

示例页面准备.png

3.2、新建Testplan

现在我们新建一个ZJHMultilingualTestPlan.xctestplan,可以针对几种语言和地区运行UI测试。选择ZJHMultilingualTestPlan.xctestplan。 在Configurations选项卡中,通过按Enter并替换现有文本,将Configuration 1重命名为America。在配置设置中,将Application Language设置为English。 将Application Region设置为United States。仍在Configurations选项卡中,单击+添加新配置。选择新创建的配置文件,然后按Enter将其重命名为China,在China配置中,将Application Language设置为Chinese,Simplified。 将Application Region设置为China Mainland。同理继续添加Taiwan,语言和地区配置为Chinese,TraditionalTaiwan

配置语言和地区.png 然后再将Testplan添加到Scheme中:

点击添加到到Scheme中.png

3.3、运行Testplan

先点 Test navigator最上面,切换使用ZJHMultilingualTestPlan,转到ZJHTestPlanUITests,右击菱形,然后弹框中选择Run in All Configurations

运行ZJHMultilingualTestPlan.png

运行结束后,我们可以查看对应的测试报告,可以看到三个配置都有运行,然后ChinaTaiwan运行成功了,America运行失败,查看失败信息和截图,我们可以发现英文页面下,出现了中文。修改过后,再重新运行就能全部正确了。

查看ZJHMultilingualTestPlan运行结果.png

四、测试时分析APP

Xcode提供了多种工具来分析您的应用程序的运行情况,但其中许多工具无法一起使用或会影响性能。 您还必须记住该工具存在,并打开(和关闭)它们,并注意结果。 好消息! 您可以将分析工具设置为测试计划的一部分! 转到ZJHMultilingualTestPlan计划的配置之一。 看一下底部的设置:

查看底部配置.png

4.1、Sanitizers

这三个sanitizers将在您的应用程序运行时检查以下内容:

  • Address Sanitizer (ASan)检测到代码中的内存使用错误。 启用ASan可能会稍微降低测试速度并增加内存使用量,但是确保您的代码没有内存冲突是值得的。
  • Thread sanitizer(TSan)可帮助您检测data races,其中多个线程以不安全的方式访问和修改内存区域。 这些都是很难预测的,因此很难找到和调试。
  • Undefined Behavior Sanitizer(UBSan)检测到诸如除以零或访问其边界之外的数组之类的问题。

4.2、Runtime API Checking

默认情况下,Main Thread Checker 处于启用状态,并且在测试时应保持这种方式。 如果在后台线程上使用UIKitAppKit之类的框架,它将发出警告。 您应该只在主线程中更新UI。

4.3、Memory Management

Malloc Scribble, Malloc Guard Edges and Guard Malloc帮助您检测释放的内存的使用情况和缓冲区溢出(buffer overruns)。 后者意味着您的程序在将数据写入缓冲区时会超出缓冲区的范围。 这导致覆盖邻近缓冲存储器位置的存储。

注意:不能同时使用这些工具,也不能在同一配置中同时使用ASanTSan

启用Zombie Objects设置后,程序中的对象达到保留计数0时将不会被释放。相反,它们将像僵尸一样半活半死。 当程序尝试访问此类对象时,您会收到警告。

另外,要了解有关Xcode中的内存管理工具的更多信息,请查看Apple的Malloc Debugging文档。


参考链接: XCUITest 之测试计划(xctestplan)的使用:https://www.jianshu.com/p/78e607c0619c 自动化Test使用详细解析(四) —— 单元测试和UI Test(一):https://www.jianshu.com/p/a4edf7202961 Xcode Test Plans:https://useyourloaf.com/blog/xcode-test-plans/ Xcode Test Plans for iOS: Getting Started:https://www.raywenderlich.com/10212963-xcode-test-plans-for-ios-getting-started 3分钟实现iOS语言本地化/国际化(图文详解):https://cloud.tencent.com/developer/article/1143302