2012-09-06 39 views
27

Tôi đã thấy mọi người đăng bài về điều này ở đây và ở nơi khác, nhưng tôi chưa tìm thấy giải pháp nào hoạt động. Tôi đang sử dụng XCode 4.4 và có một loạt các bài kiểm tra đơn vị được thiết lập. Tôi đã chạy tất cả trước khi vào dự án này, vì vậy tôi biết rằng họ vượt qua/thất bại khi họ có nghĩa vụ phải nếu họ đang thực sự chạy.Một số bài kiểm tra bài kiểm tra đơn vị của tôi không hoàn thành trong XCode 4.4

Tôi có khoảng 15 bộ kiểm tra và mỗi bộ chứa 1-7 thử nghiệm. Trong hầu hết các lần thử, tất cả các phòng thử nghiệm đã hoàn thành (và đã qua) trừ 1 (FooTests). Nó đưa ra cảnh báo:

FooTests did not finish 
    testFoo did not finish 

XCode sẽ báo cáo rằng thử nghiệm thành công, bất kể những gì xảy ra trong các bài kiểm tra chưa hoàn thành. Một điều cần lưu ý, đôi khi nó là một thử nghiệm khác nhau mà sẽ không hoàn thành, và đôi khi nhiều bộ sẽ không kết thúc. Tôi đã không nhận thấy một trường hợp mà tất cả các bài kiểm tra kết thúc, nhưng xét xử bởi hành vi này dường như ngẫu nhiên tôi tin rằng nó là có thể.

Vì vậy, đây có phải là lỗi trong XCode không? Tôi không thể nghĩ ra bất kỳ lý do nào khác mà các bài kiểm tra ngẫu nhiên không hoàn thành và sau đó làm cho XCode báo cáo rằng mọi thứ đã thành công. Có giải pháp nào không?

+0

Đã tìm thấy cùng một vấn đề. Làm sạch mục tiêu và chạy thử nghiệm dường như giải quyết vấn đề khi nó bật lên. Tôi nghĩ rằng đó là một lỗi. – timthetoolman

+0

Làm sạch không hiệu quả với tôi:/ –

+0

Tôi cũng gặp vấn đề này, nhưng tôi thấy rằng nó dường như chỉ xảy ra khi tôi không chạy tất cả các bài kiểm tra cùng một lúc. Nếu tôi chỉnh sửa lược đồ và bỏ chọn một số kiểm tra, tôi sẽ nhận được cảnh báo "không kết thúc" khi tôi không làm như vậy. – Cruinh

Trả lời

4

Tôi vừa gặp sự cố này với XC4.5DP4.

Tôi đã thử nghiệm một số hoạt động trong vòng lặp và không làm gì khác khi nó rơi ra khỏi vòng lặp và tôi đã gặp phải lỗi "không kết thúc".

Trong một nỗ lực để chứng minh rằng các thử nghiệm đã kết thúc, tôi đã thêm này như dòng cuối cùng:

NSLog(@"done"); 

Không chỉ "làm" được in tới đầu ra - bây giờ Xcode nói rằng các thử nghiệm có đã kết thúc.

Dường như là một cách giải quyết ... hãy tìm hình.

+0

Điều này tái tạo một cách đáng tin cậy cho tôi - nếu tôi lấy lại dòng đăng nhập, Xcode sẽ quay trở lại để nói "không kết thúc". Số dặm của bạn, tuy nhiên, có thể thay đổi ... –

+0

Điều này không có gì cho tôi. Bài kiểm tra không hoàn thành cho tôi liên quan đến yêu cầu web và có thể không đợi cho đến khi yêu cầu được thực hiện để chạy phần còn lại của bài kiểm tra. Nhưng tôi có các thử nghiệm khác bằng cách sử dụng yêu cầu web hoạt động tốt ... –

+0

Tôi cũng thấy điều này ... lạ. – seanicus

2

Tôi có cùng cảnh báo trong Nhật ký điều hướng nhật ký. Tôi đã sửa nó cho tôi.

Trong dự án của tôi, tôi đã có 2 Đề án, một cho chạy dự án và một cho các bài kiểm tra đơn vị.

  1. Tới sản phẩm -> Edit Scheme ...
  2. Chọn Scheme UnitTest trong bảng chọn chương trình
  3. Chọn "Test" -Icon trên trái
  4. Thay đổi debugger từ LLĐB đến GDB và nhấn OK
  5. Bài kiểm tra sẽ kết thúc ngay bây giờ. (Đối với tôi nó hoạt động tốt)
+4

Điều đó đã làm việc cho tôi trong quá khứ, nhưng không hoạt động trong trường hợp này. –

4

Tôi đang sử dụng XCode46-DP3 và tôi vừa giải quyết vấn đề này trong các thử nghiệm của mình. Tôi đã thử nghiệm nhiều lần để bắt đầu một máy chủ web và sau đó thực hiện cuộc gọi http đến nó; ở cuối kiểm tra, máy chủ web bị dừng. Trong tuần trước, các thử nghiệm này đã bắt đầu có cảnh báo 'không kết thúc'. Đối với tôi đã đủ để thêm giấc ngủ sau khi kết thúc các thử nghiệm này (chính xác tôi đã thêm nó vào teardown):

- (void)tearDown { 
    [self.httpServer stop]; 
    [NSThread sleepForTimeInterval:1.0]; 
    self.httpServer = nil; 
    self.urlComposer = nil; 
} 
+0

+1 để đề cập rằng bạn đặt nó trong "tearDown". chỉ một bình luận: bạn không nên gọi [super tearDown] ở đây? –

17

Tôi đang trên XCode 4.5.2. Đối với thử nghiệm đơn vị ứng dụng, nếu các bộ thử nghiệm của bạn kết thúc nhanh đến mức ứng dụng chính không được tải chính xác trước đó, bạn sẽ nhận được cảnh báo. Bạn chỉ đơn giản là có thể tránh được vấn đề bằng cách thêm một giấc ngủ vào cuối thử nghiệm của bạn như sau. Nó không xảy ra cho thử nghiệm đơn vị logic.

[NSThread sleepForTimeInterval:1.0]; 
+1

Tôi đã tìm thấy bạn thực sự có thể thực hiện điều này '0.0' và nó hoạt động tốt (và không làm chậm các bài kiểm tra của bạn). –

+2

Trên một bộ nhanh, tôi vẫn thấy nó với 0,0.Tôi đã đặt mã này trong hàm tearDown của tôi: '- (void) tearDown { static int loaded = FALSE; if (! Loaded) { [NSThread sleepForTimeInterval: 1.0]; được tải = TRUE; } [super tearDown]; } ' – AlexChaffee

+0

Chỉ cần đi qua ngày hôm nay, nghĩ rằng tôi đã đi hạt lol, cảm ơn bạn đã giải thích! – Zhang

0

tôi đã cùng một vấn đề chạy với XCode 4.6, lý do cho nó, trong trường hợp của tôi, là sự mâu thuẫn giữa các chương trình và các đơn vị xét nghiệm thực tế trong vụ kiện thử nghiệm. Trong chương trình tôi đã có một số bộ kiểm tra nhưng trong tập tin .m của họ, một số xét nghiệm đơn vị đã được nhận xét.

Để giải quyết vấn đề: hoặc bỏ ghi chú các bài kiểm tra hoặc bỏ chọn các tập tin/phù hợp trong chương trình này và tất cả sẽ trở thành màu xanh lá cây một lần nữa :)

cho những người như tôi mà quên làm thế nào để đạt được kế hoạch đó là những bước cần thiết :

  1. nhấp chuột phải vào tên dự án trong phần lược đồ (bên phải nút stop)
  2. chọn chỉnh sửa chương trình
  3. chọn debug thử nghiệm
  4. nhấp chuột vào hình tam giác bên cạnh các dự án đơn vị kiểm tra và bên cạnh mỗi tập tin bạn có một hộp kiểm
  5. file bỏ chọn mà bạn đặt thử nghiệm đơn vị trong ý kiến ​​

hy vọng điều này giúp

3

Vấn đề dường như các bài kiểm tra của bạn chấm dứt quá nhanh để Xcode nhận và phân tích các thông điệp tường trình cho biết lỗi hoặc thành công. Ngủ trong 1 giây trong lần chạy thử nghiệm cuối cùng hoạt động đáng tin cậy đối với tôi, trong đó 0.0 thì không. Để xem trường hợp thử nghiệm nào là trường hợp thử nghiệm cuối cùng, hãy kiểm tra hành động thử nghiệm trong hộp thoại Đề án.

Tôi tạo ra một trường hợp thử nghiệm WorkaroundForTestsFinishingTooFast riêng biệt, với một phương pháp duy nhất:

- (void)testThatMakesSureWeDontFinishTooFast 
{ 
    [NSThread sleepForTimeInterval:1.0]; 
} 

Vấn đề là khi bạn thêm trường hợp thử nghiệm nhiều hơn, bạn sẽ cần phải đảm bảo rằng thử nghiệm này là phương pháp chạy cuối cùng. Điều đó có nghĩa là việc loại bỏ và thêm lớp này từ hành động Test như sắp xếp lại các trường hợp kiểm thử là không được phép. Mặt khác, bạn chỉ trì hoãn toàn bộ gói thử nghiệm của mình sau 1 giây.

+0

Tôi đã thêm độ trễ trong 'tearDown', không cần phải lo lắng. –

2

Đối với tôi, giải pháp là giảm sản lượng ghi nhật ký từ các phần của ứng dụng mà các thử nghiệm đã được thử nghiệm. Tôi nghĩ rằng xcode không thể phân tích cú pháp kết quả kiểm tra trong thời gian vì đầu ra khác tôi đã có trong suốt ứng dụng.

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