2016-03-15 12 views
8

Tôi đang cố gắng tìm hiểu cách hạn chế các thử nghiệm của mình để người báo cáo chỉ xem xét một chức năng được đề cập khi thử nghiệm được viết cụ thể là cho chức năng đó.Cách chỉ định các chức năng/phương pháp nào cần được kiểm tra bằng cách sử dụng Karma, Jasmine và Istanbul

Ví dụ sau từ PHPUnit doc thấy khá tốt những gì tôi cố gắng để đạt được:

Các @covers chú thích có thể được sử dụng trong mã kiểm tra để xác định các phương pháp (s) một phương pháp thử nghiệm muốn thử nghiệm :

/** 
* @covers BankAccount::getBalance 
*/ 
public function testBalanceIsInitiallyZero() 
{ 
    $this->assertEquals(0, $this->ba->getBalance()); 
} 

Nếu thử nghiệm trên sẽ được thực hiện, chỉ có chức năng getBalance sẽ được đánh dấu là được bảo hiểm, và không ai khác.

Bây giờ, một số mẫu mã thực tế từ các thử nghiệm JavaScript của tôi. Xét nghiệm này cho thấy các hành vi không mong muốn mà tôi cố gắng để thoát khỏi:

it('Test get date range', function() 
{ 
    expect(dateService.getDateRange('2001-01-01', '2001-01-07')).toEqual(7); 
}); 

Thử nghiệm này sẽ đánh dấu chức năng getDateRange như bảo hiểm, mà còn bất kỳ chức năng khác mà được gọi từ bên tronggetDateRange. Bởi vì điều này quirk bảo hiểm mã thực tế cho dự án của tôi có lẽ là thấp hơn rất nhiều so với mức độ bảo hiểm mã được báo cáo.

Làm cách nào để ngăn chặn hành vi này? Có cách nào để làm cho Karma/Jasmine/Istanbul hành xử theo cách tôi muốn, hay tôi cần phải chuyển sang một khuôn khổ khác để thử nghiệm JavaScript?

+0

Điều cần lưu ý là sử dụng tính năng tiêm phụ thuộc và mocks để giảm số lượng cuộc gọi đến mã sản xuất thực tế. – henrikmerlander

+0

Tôi đồng ý với henrikmerlander. Bên cạnh đó, nếu bạn đang sử dụng các cuộc gọi chức năng thực sự thay vì mocks bên trong phương pháp thử nghiệm gián tiếp bạn đang thử nghiệm chức năng đó – ejosafat

Trả lời

2

Tôi không thấy bất kỳ lý do cụ thể nào cho những gì bạn đang yêu cầu. Tôi muốn nói nếu thử nghiệm của bạn gây ra một chức năng lồng nhau được gọi, sau đó chức năng được bảo hiểm quá. Bạn đang thực sự gián tiếp kiểm tra đoạn mã đó, vậy tại sao không nên được bao gồm trong các số liệu bảo hiểm mã? Nếu hàm bên trong chứa một lỗi, kiểm thử của bạn có thể bắt được nó ngay cả khi nó không kiểm tra trực tiếp.

Bạn có thể chú thích mã của bạn với chú thích đặc biệt để kể Istanbul để bỏ qua những con đường chắc chắn: https://github.com/gotwarlost/istanbul/blob/master/ignoring-code-for-coverage.md nhưng đó là nhiều hơn cho điều ngược lại tôi nghĩ, không phải để giảm vùng phủ sóng nếu bạn biết bạn không muốn có một con đường thực hiện đặc biệt là được bảo hiểm, có thể bởi vì nó sẽ là quá khó để viết một trường hợp thử nghiệm cho nó.

Ngoài ra, nếu bạn quan tâm đến các chức năng "mức thấp" được thử nghiệm riêng biệt, hãy đảm bảo mã của bạn được cấu trúc theo cách mô-đun để bạn có thể tự kiểm tra mã đó trước. Bạn cũng có thể thiết lập các cấu hình chạy thử khác nhau, vì vậy bạn có thể có một bộ chỉ kiểm tra logic cơ bản và báo cáo mức độ phù hợp cho điều đó.

Như được đề xuất trong phần bình luận, việc chèn và phụ thuộc có thể giúp bạn kiểm tra tập trung hơn, nhưng về cơ bản bạn luôn muốn có một số bài kiểm tra ở mức cao, nơi bạn kiểm tra tích hợp các phần này với nhau. Nếu bạn thử tất cả mọi thứ thì bạn sẽ không bao giờ thử nghiệm những phần thực tế làm việc cùng nhau.

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