2015-09-02 17 views
21

Apple đã giới thiệu trong Xcode 7 Kiểm tra giao diện người dùng mới nhưng tôi có một cuộc đấu tranh bất cứ khi nào các thử nghiệm khởi chạy ứng dụng, nó bắt đầu với dữ liệu mà ứng dụng đã có trước đó. Nó có nghĩa là các xét nghiệm không thể độc lập và có thể bị ảnh hưởng bởi các xét nghiệm khác.Làm cách nào để đặt lại dữ liệu ứng dụng sau mỗi lần kiểm tra bằng Kiểm tra giao diện người dùng Xcode 7?

Không thể truy cập mặc định người dùng và dữ liệu khác vì ứng dụng đang chạy thử nghiệm không có quyền truy cập vào gói ứng dụng được thử nghiệm. Các tập lệnh cũng nằm ngoài câu hỏi vì chúng có thể chạy trước hoặc sau khi thử nghiệm. Và không có cách nào để thực thi NSTask trên iOS để chạy tập lệnh trước mỗi bộ thử nghiệm.

Có cách nào để đặt lại dữ liệu ứng dụng trước mỗi bộ thử nghiệm không?

Trả lời

20

Không theo cách thẳng tiến. Nhưng có một số cách giải quyết.

XCUIApplication có thể đặt đối số dòng lệnh và biến môi trường có thể thay đổi hành vi của ứng dụng.

Một ví dụ đơn giản của main.m tập tin của bạn:

int main(int argc, char * argv[]) { 
#if DEBUG 
    // Reset all data for UI Testing 
    @autoreleasepool { 
     for (int i = 1; i < argc; ++i) { 
      if (0 == strcmp("--reset-container", argv[i])) { 
       NSArray *folders = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES); 
       NSFileManager *fm = [[NSFileManager alloc] init]; 
       for (NSString *path in folders) { 
        [fm removeItemAtPath:path error:nil]; 
       } 
       // Also remove documents folder if necessary... 
      } 
     } 
    } 
#endif 
    @autoreleasepool { 
     return UIApplicationMain(argc, argv, nil, 
           NSStringFromClass([AppDelegate class])); 
    } 
} 

Và trong -[XCTestCase setUp] add:

XCUIApplication *app = [[XCUIApplication alloc] init]; 
app.launchArguments = @[@"--reset-container"]; 
[app launch]; 
+0

Vâng, tôi cũng đã suy nghĩ về điều này nhưng tôi hy vọng có giải pháp tốt hơn. Cuối cùng, tôi quyết định mở rộng giải pháp của bạn cũng bao gồm các địa điểm khác và mặc định của người dùng. –

+0

@ TomášLinhart: bạn có thể chia sẻ giải pháp của mình không? – Peacemoon

+3

Tôi có thể sử dụng điều này trong Swift như thế nào? –

6

Nếu chuẩn bị ứng dụng cho UITests bên application:didFinishLaunchingWithOptions: là ok trong trường hợp của bạn, sau đó bạn có thể làm như sau:

Trong phương thức setUp() của lớp thử nghiệm mở rộng XCTestCase thêm theo đang ing:

let application = XCUIApplication() 
application.launchEnvironment = ["UITESTS":"1"] 
application.launch() 

Sau đó, trong application:didFinishLaunchingWithOptions: bạn có thể kiểm tra cờ sử dụng đoạn mã sau:

func application(_ application: UIApplication, 
       didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool { 

    let env = ProcessInfo.processInfo.environment 
    if let uiTests = env["UITESTS"], uiTests == "1" { 
     // do anything you want 
    } 
    // further set up code 
} 

Tất nhiên nếu đó là một lựa chọn cho bạn.

Chú ý: Thay vì đặt "1" như là đối số cho "UITESTS" cờ, bạn có thể xác định giá trị khác nhau đối với trường hợp thử nghiệm khác nhau - hoặc thậm chí phương pháp thử (nhưng trong trường hợp như vậy, bạn nên khởi động các ứng dụng từ phương pháp kiểm tra, không setUp())

CHÚ Ý 2: Tôi đề xuất gói mã xử lý cờ vào khối #if DEBUG.

4

Tôi đã đặt lại dữ liệu ứng dụng bằng cách sử dụng một số tiêu đề riêng tư để truy cập vào bàn đạp và ứng dụng cài đặt.

Đầu tiên tôi đã thêm một giai đoạn Chạy kịch bản để xoá bỏ nó khi các bài kiểm tra bắt đầu:

/usr/bin/xcrun simctl uninstall booted com.mycompany.bundleId

Và sau đó tôi sử dụng giải pháp tôi đã viết here để xoá bỏ nó sử dụng một kịch bản thử nghiệm chạy trên tearDown các cuộc gọi để đặt lại sau mỗi lần kiểm tra.

0

Trong trường hợp của tôi, tôi cũng yêu cầu đặt lại quyền. Và có một tùy chọn để xóa ứng dụng của bạn và đặt lại quyền của hệ thống chỉ làm cho thử nghiệm xóa ứng dụng và điều hướng đến cài đặt.

Đã được trả lời trong S.O. chủ đề: Is there a way to reset the app between tests in Swift XCTest UI in Xcode 7?

Các vấn đề liên quan