2013-08-08 35 views
30

Một số nền:Đừng khởi động mô phỏng khi chạy unittests

Tôi đã ứng dụng iOS với mục tiêu cấu hình để chạy unittests. Và tôi đang chạy công cụ tự động hóa xây dựng jenkins trên MacBook của tôi để tự động xây dựng ứng dụng này và chạy tất cả các kiểm tra (bằng cách sử dụng công cụ dòng lệnh xcodebuild).

Mọi thứ hoạt động tốt với Xcode 4. Công cụ tự động hóa xây dựng này đang chạy dưới người dùng khác và đang chạy tất cả các thử nghiệm này.

Tôi đã chuyển sang Xcode 5 gần đây và nó đã bắt đầu không thành công vì không thể khởi chạy Trình mô phỏng.

Vấn đề

Tôi có một unittests chương trình được cấu hình để chạy thử nghiệm (kiểm tra logic). AI chạy các thử nghiệm sử dụng một trong hai phương pháp:

  • lệnh U trong Xcode

  • Hoặc dòng lệnh "/ usr/bin/xcodebuild -scheme unittests -sdk iphonesimulator -Cấu hình Thả sạch build TEST_AFTER_BUILD = YES "

Trong cả hai trường hợp, nó cố gắng bắt đầu trình mô phỏng. Tuy nhiên, theo tôi hiểu nó không cần nó. Dù sao nó chạy trên đầu x86 và nó không giống như bất kỳ ứng dụng được cài đặt trên Simulator.

Có cách nào để loại bỏ phần khởi động giả lập này (vì nó phá vỡ tự động hóa xây dựng của tôi) không?

Cập nhật 1

vẻ để tìm câu hỏi rất tương tự, nhưng không thể làm cho nó làm việc: Run logic tests in Xcode 4 without launching the simulator

Cập nhật 2

tôi thấy rất phù hợp và thú vị câu hỏi/trả lời : Apple CI/Xcode Service and Jenkins

+0

Câu hỏi này cũng có thể hữu ích. Các bước phải khá giống nhau đối với ứng dụng iOS. http://stackoverflow.com/questions/19219706/xcode-5-unit-testing-starts-my-app –

+0

@CleverError: Cảm ơn. Tôi sẽ xem qua nó. –

+0

Tại sao bạn không muốn chạy trình mô phỏng? – quellish

Trả lời

12

Bạn có thể tạo Kiểm tra đơn vị Mac OSX thay vì n Kiểm tra đơn vị iOS. Điều này đòi hỏi rằng bạn không bao gồm bất kỳ thư viện iOS cụ thể trong các bài kiểm tra đơn vị mặc dù. Bạn có thể làm điều này thông qua như sau:

  1. Chọn dự án -> thả mục tiêu xuống -> "Add Target ..."
  2. Chọn "Mac OSX" -> "Khác" -> "Đơn vị Cocoa kiểm tra Bundle"
  3. Tạo gói thử nghiệm như bạn sẽ một dự án bình thường

bạn có thể bây giờ thêm nguồn để các đơn vị kiểm tra và chạy nó như một thử nghiệm iOS mà không cần khởi động mô phỏng.

+2

Đó là hướng mà tôi đang di chuyển ngay bây giờ. Tuy nhiên, iOS và OS X không chính xác cùng một hệ điều hành (đặc biệt là tính đến tất cả sự khác biệt giữa các khung công tác) –

13

Tôi đã hỏi cùng một câu hỏi với kỹ sư táo. Rất tiếc, có vẻ như bạn không thể thực hiện việc này và ở lại với iOS cùng một lúc. Có một số thủ thuật bạn có thể làm để kiểm tra xem thử nghiệm. Bạn có thể đặt đoạn mã này trong AppDelegate của mình.h hoặc một số lớp học toàn cầu khác để nói không tải một viewController gốc và ngăn chặn bất kỳ thứ wierdo ui từ hư kiểm tra đơn vị của bạn:

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

Tôi cũng đã có một kỹ sư táo xác minh điều này là một tấm séc hợp pháp. Và để cung cấp tín dụng mà tín dụng là do, đây là từ: Programmatically determine current target (run or test) in iOS project

EDIT: Tôi cũng đã thành công với điều này và đó là nhiều hơn một chút thẳng về phía trước:

static BOOL isTesting() { 
    return [[[NSProcessInfo processInfo] processName] isEqualToString:@"xctest"]; 
} 
+0

Tôi đoán rằng bạn muốn làm: return isTesting; Trái ngược với 'return NO;' –

+0

Có lỗi. Dán mã từ một dự án và không chú ý! – rfrittelli

+0

Đó là một giải pháp thú vị! – LightningStryk

16

Sử dụng Xcode 7 và xCtool.

xctool có khả năng thực hiện các kiểm tra đơn vị không có trình mô phỏng.

Để làm việc này,

1. Cập nhật cài đặt đích để chạy mà không cần ứng dụng máy chủ.

Chọn dự án của bạn -> sau đó kiểm tra mục tiêu -> Đặt ứng dụng máy chủ thành không.

enter image description here

2. Cài đặt xctool, nếu bạn không có nó.

brew install xctool 

3. Chạy thử nghiệm bằng thiết bị đầu cuối với xctool.

xctool -workspace yourWorkspace.xcworkspace -scheme yourScheme run-tests -sdk iphonesimulator 
+1

Bạn có thể gặp phải lỗi trình liên kết với các lớp không có sẵn trong nhóm thử nghiệm, giải quyết chúng để làm việc này. – rustylepord

+0

Điều này thật kỳ quặc. Tài liệu của xctool nói rõ [Nếu bạn đang chạy xctool trong tích hợp liên tục, tài khoản người dùng gọi xctool phải có ngữ cảnh GUI hoạt động. Nếu không, trình mô phỏng sẽ không khởi động với cảnh báo khó hiểu] (https://github.com/facebook/xctool). –

1

Mục tiêu kiểm tra OSX có thể trở thành một rắc rối lớn vì bạn phải tự quản lý tệp nguồn cần bao gồm. Đặt @testable import YourAppName vào đầu tệp XCTest của bạn là cách thuận tiện hơn. Vì vậy, chỉ cần ngăn ứng dụng của bạn khởi chạy trong trường hợp chạy XCTest.

Trong appdelegate bạn đặt: (Swift giải pháp 3)

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

... 

này sẽ không ngăn chặn sự mô phỏng từ tung ra, nhưng sẽ giúp bạn tiết kiệm rất nhiều thời gian.

+0

Tôi không hiểu, nếu nó không dừng trình mô phỏng khởi chạy thì đây là câu trả lời cho câu hỏi như thế nào? – smileBot

0

Cách giải quyết:

App vẫn sẽ ra mắt nhưng bạn có thể #if để xác định những gì bạn không muốn chạy.

Tiếp cận:

  1. Tạo một cấu hình tùy chỉnh xây dựng được gọi là Test bằng cách sao chép Debug (Dự án> Thông tin> tạo cấu hình mới)
  2. Trong Build Settings>Active Compilation Conditions cho Test thêm TESTING
  3. Sửa Đề án> Thông tin> Xây dựng cấu hình, đặt cấu hình xây dựng làm Thử nghiệm
  4. Sử dụng #if !TESTING#endif xung quanh c ode bạn không muốn thực hiện khi thử nghiệm.

Khung: khung

Nếu bạn đã nhúng, tạo cùng cấu hình xây dựng trong khuôn khổ, do đó nhị phân khung được liên kết đúng cách.