UITesting with Multiple XCTestCase Class

961 views Asked by At

I am writing UITest cases for my Project. So I want to have multiple files either subclassed to XCTestCase or subclassed to my Other Test Classes. Whenever I create a such File, I am getting the following error.

duplicate symbol _lastUsedSaveDirectory in:
/Users/UserName/Library/Developer/Xcode/DerivedData/ProjectName/Build/Intermediates/CodeCoverage/Intermediates/Project.build/Debug/Project_UITests.build/Objects-normal/x86_64/SecondaryFile.o
/Users/UserName/Library/Developer/Xcode/DerivedData/ProjectName/Build/Intermediates/CodeCoverage/Intermediates/Project.build/Debug/Project_UITests.build/Objects-normal/x86_64/MainFile.o
ld: 1 duplicate symbol for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

I have tried the following but nothing works:

1. Created "SecondaryFile" by subclassing it from "MainFile" which is a subclass of "XCTestCase".
2. Created "SecondaryFile" by subclassing it directly from "XCTestCase".
3. Created both .h and .m file for both the "MainFile" and "SecondaryFile"

MainFile.m

#import <XCTest/XCTest.h>

@interface MainFile_UITests : XCTestCase
@end

@implementation MainFile_UITests

- (void)setUp {
        [super setUp];

        // Put setup code here. This method is called before the invocation of each test method in the class.

        // In UI tests it is usually best to stop immediately when a failure occurs.
        self.continueAfterFailure = NO;
        // UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method.
        [[[XCUIApplication alloc] init] launch];
        // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this.
}

- (void)tearDown {
        // Put teardown code here. This method is called after the invocation of each test method in the class.
        [super tearDown];
}

- (void)testExample {
    // Use recording to get started writing UI tests.
        // Use XCTAssert and related functions to verify your tests produce the correct results.    
}

@end

SecondaryFile.m

#import <XCTest/XCTest.h>

@interface SecondaryFile_UITests : XCTestCase
@end

@implementation SecondaryFile_UITests

- (void)setUp {
        [super setUp];

        // Put setup code here. This method is called before the invocation of each test method in the class.

        // In UI tests it is usually best to stop immediately when a failure occurs.
        self.continueAfterFailure = NO;
        // UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method.
        [[[XCUIApplication alloc] init] launch];
        // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this.
}

- (void)tearDown {
        // Put teardown code here. This method is called after the invocation of each test method in the class.
        [super tearDown];
}

@end

Could someone tell me how to modularise/Create multiple File UITesting classes.

1

There are 1 answers

0
OffensivelyBad On

In order to use several UI Test files, you should first create a header file for UITests.m, then in your separate test files, inherit from UITest.h. This will give you the setUp and tearDown methods from UITests.m in your subclasses. All you have to do then is add your new test methods to you subclasses.

As an example, here is an example of a subclassed UITests file in Objective-C: https://gist.github.com/OffensivelyBad/012043f8dab50b3b024238e985462926