XCode7 UITesting - 如何添加从 UITestCase 可用的主要目标类(未定义符号错误)?

Posted

技术标签:

【中文标题】XCode7 UITesting - 如何添加从 UITestCase 可用的主要目标类(未定义符号错误)?【英文标题】:XCode7 UITesting - how to add main target classes to be available from UITestCase (Undefined symbols error)? 【发布时间】:2016-01-13 15:58:37 【问题描述】:

我正在使用 XCode7 进行 UI 测试,需要一种方法将我的应用程序重置为某个初始状态。我有一种方法可以在我的一个 .m 文件中执行此操作,该文件是主要目标的一部分。

如何使主要目标中的类在 UITestCase 中可用?

我尝试了常规导入,但出现链接器错误:

#import <XCTest/XCTest.h>
#import "CertificateManager.h"

@interface UITests : XCTestCase

@end

-(void)testWelcomeScreen

//put the app into initial state
    [[CertificateManager sharedInstance] resetApplication];
//... proceed with test

错误:

Undefined symbols for architecture i386:
  "_OBJC_CLASS_$_CertificateManager", referenced from:
      objc-class-ref in UITests.o
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)

我已将此与单元测试目标进行了比较,但除了单元测试目标已选中“允许测试主机应用程序 API”之外,看不到其他差异,而 UITest 目标根本没有此选项。

【问题讨论】:

【参考方案1】:

UI 测试在与您的生产应用不同的进程中运行。这意味着您无法从测试套件访问任何生产类。

除了触摸屏幕之外,UI 测试的唯一交互方式是设置启动参数或修改启动环境。

您可以在应用启动时使用其中任何一种来重置应用。例如,在您的 UI 测试测试中:

@interface UITests : XCTestCase
@property (nonatomic) XCUIApplication *app;
@end

@implementation FooUITests

- (void)setUp 
    [super setUp];

    self.app = [[XCUIApplication alloc] init];
    self.app.launchArguments = @[ @"UI-TESTING" ];
    [self.app launch];


- (void)testExample 
    // ... //


@end

然后,当您的应用启动时,您可以检查此参数。如果存在,请调用您应用的“重置”方法。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
    if ([[[NSProcessInfo processInfo] arguments] containsObject:@"UI-TESTING"]) 
        [[CertificateManager sharedInstance] resetApplication];
    

    return YES;

【讨论】:

以上是关于XCode7 UITesting - 如何添加从 UITestCase 可用的主要目标类(未定义符号错误)?的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 7 UITesting 用于 OS X 上的菜单栏应用程序

XCode 7 UI 测试 - 可用的操作

Swift UITesting 错误:文字中的转义序列无效。 \U201c

如何在 Xamarin.Forms.UITesting 中触发/调试后门功能?

如何获取 XCUIElement 的值?

Xcode UITesting - 如何移动 UISlider?