Don't launch simulator when running unittests

前端 未结 6 1426
悲哀的现实
悲哀的现实 2020-12-07 17:44

Some background:

I have iOS application with a target configured to run unitTests. And I am running build automation tool jenkins on my MacBook whic

相关标签:
6条回答
  • 2020-12-07 17:58

    Workaround:

    App will still launch but you can #if to define what you don't want to run.

    Approach:

    1. Create a custom build configuration called Test by duplicating Debug (Project > Info > create new configuration)
    2. In Build Settings > Active Compilation Conditions for Test add TESTING
    3. Edit Scheme > Info > Build Configuration, set build configuration as Test
    4. Use #if !TESTING #endif around the code you don't want to execute when testing.

    Frameworks:

    If you have embedded frameworks, create the same build configuration in the framework, so that the framework binary is properly linked.

    0 讨论(0)
  • 2020-12-07 18:04

    You can create a Mac OSX Unit Test instead of an iOS unit test. This requires that you not include any iOS specific libraries in the unit tests though. You can do this via the following:

    1. Select the project -> the target drop down -> "Add Target..."
    2. Select "Mac OSX" -> "Other" -> "Cocoa Unit Testing Bundle"
    3. Create the testing bundle as you would a normal project

    You can now add sources to the unit test and run it like an iOS test without launching the simulator.

    0 讨论(0)
  • 2020-12-07 18:04

    A osx test target can become a huge hassle because you have to manage yourself which source file to include. Putting @testable import YourAppName on top of your XCTest files is way more convenient. So just prevent your app from launching in case of a XCTest run.

    In your AppDelegate put: (Swift 3 solution)

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool
    {
        if ProcessInfo.processInfo.environment["XCInjectBundleInto"] != nil {
            return false
        } 
    
    ...
    

    This wont prevent the simulator from launching, but will save you a lot of time.

    0 讨论(0)
  • 2020-12-07 18:04

    You can run unit and ui tests in headless mode with Xcode 9 and a command from your terminal. For reference sample commands:

    Building and testing a workspace

    xcrun xcodebuild -workspace "YOUR_WORKSPACE_NAME.xcworkspace" -scheme "YOUR_SCHEME" -sdk "iphonesimulator12.0" -destination "OS=12.0,name=iPhone X" -configuration Debug -enableCodeCoverage YES clean build test
    

    For project

    xcrun xcodebuild -project "YOUR_PROJECT_NAME.xcodeproj" -scheme "YOUR_SCHEME" -sdk "iphonesimulator12.0" -destination "OS=12.0,name=iPhone X" -configuration Debug -enableCodeCoverage YES clean build test
    
    0 讨论(0)
  • 2020-12-07 18:07

    I've asked the same question to apple engineers. Unfortunately it doesn't seem you can accomplish this and stay with iOS at the same time. There are some tricks you can do to check if testing. You could put this code snippet in your AppDelegate.h or some other global class to say not load a root viewcontroller and prevent any wierdo ui stuff from corrupting your unit tests:

    static BOOL isTesting() {
        BOOL isTesting = !isEmpty([[[NSProcessInfo processInfo] environment] objectForKey:@"XCInjectBundle"]);
        return isTesting;
    }
    

    I've also had an apple engineer verify this is a legitimate check. And to give credit where credit is due, this is from: Programmatically determine current target (run or test) in iOS project

    EDIT: I've also had success with this and it's a little more straight forward:

    static BOOL isTesting() {
        return [[[NSProcessInfo processInfo] processName] isEqualToString:@"xctest"];
    }
    
    0 讨论(0)
  • 2020-12-07 18:08

    Using xCode 7 and xCtool.

    xctool is capable of executing unit tests without the simulator.

    To get this working,

    1 . Update target settings to run without a host app.

    Select your project --> then test target --> Set the host application to none.

    2. Install xctool , if you don't have it.

    brew install xctool
    

    3. Run the tests using terminal with xctool.

    xctool -workspace yourWorkspace.xcworkspace -scheme yourScheme run-tests -sdk iphonesimulator
    
    0 讨论(0)
提交回复
热议问题