2012-03-15 33 views
6

Tôi đang tạo thư viện tĩnh cho iOS và đang cố gắng lấy dữ liệu mã vùng cho các bài kiểm tra đơn vị của nó. Tôi đang sử dụng CoverStory để hình dung các tập tin bảo hiểm mã được tạo ra.Kết quả phủ sóng mã không chính xác trên XCode khi kiểm tra ngoại lệ

Tôi nhận được thông tin chính xác cho hầu hết các thử nghiệm.

Tuy nhiên, bất kỳ thử nghiệm nào đang xác minh rằng ngoại lệ phải được ném không được đánh dấu là đã kiểm tra.

Ví dụ phương pháp

- (void)shouldThrow:(BOOL)throw { 

    if (throw) 
     @throw [NSException exception...]; 

    NSLog(@"not thrown"); 

} 

Tested với các thử nghiệm

- (void)testShouldThrow { 
    STAssertThrows([myObject shouldThrow:YES], @"Should have thrown an exception"); 

    STAssertNoThrow([myObject shouldThrow:NO], @"Should not have thrown an exception"); 
} 

Passes tất cả các bài kiểm tra (ví dụ: các ngoại lệ được ném chính xác). Tuy nhiên, phạm vi mã không hiển thị 100% - dòng có số @throw không được đánh dấu là đã kiểm tra.

Bất kỳ ý tưởng nào?

Trả lời

3

Dòng có @throw trên nó không hoàn thành (vì ngoại lệ được ném), vì vậy nó không được đánh dấu là được bao phủ. Bạn có thể gửi một lỗi, nhưng điều này có thể là khá khó khăn cho họ để sửa chữa. Nếu đó là một dòng duy nhất trong một câu lệnh chi nhánh, có thể rất khó để biết nó đã được thử nghiệm chưa, nhưng nếu có các dòng trước khi nó được thực hiện, bạn cũng sẽ phải giả định rằng nó là tốt.

Điều tồi tệ là bạn sẽ không bao giờ có thể đạt tới 100%.

+0

Đó là những gì tôi đã sợ: (Tôi đã đặt điểm ngắt trên đường nên tôi biết nó đang được thử nghiệm nhưng sẽ rất tuyệt khi có thể tự động hóa thử nghiệm đó!) – deanWombourne

0

Vấn đề còn tệ hơn nữa là dường như các bộ đếm của các dòng trước @throw trong cùng một khối điều kiện cũng không phải là coveralbe. Do đó, việc viết mã đơn giản trước @throw làm điểm đánh dấu sẽ không giúp được vấn đề.

Tuy nhiên, tôi thấy rằng các điều kiện bao gồm biến ("if (YES)", "if (1 == 1)" không nằm trong trường hợp). Vì vậy, một điều khó khăn mà chúng ta có thể làm là đầu tiên xác định một biến điều kiện tầm thường và sau đó thêm một thử nghiệm điều kiện bao gồm biến đó trước khi @throw.

static BOOL __trivialYES = YES; //for cover @throw, and never use 'const' 

sau đó

if(__trivialYES) @throw ...; 

nên Điều này giúp các vấn đề và cho thuận tiện, bạn có thể xác định vĩ mô của riêng bạn để làm những việc này.

#define #throw if (__trivialYES) 

và sau đó báo cáo kết quả ném:

#throw ...; 

và điều này có lẽ làm cho việc kiểm tra vùng phủ sóng tốt hơn.

PS: '#throw' chỉ là một macro mẫu. Nó giống như macro khác. '#' Chỉ là một charactor hợp lệ (đối với một số phần mềm biên dịch trước), làm cho nó trông đặc biệt.

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