2009-08-22 58 views
16

Tôi đã đi qua một số bài viết trên stackoverflow và rất nhiều bài viết về bài kiểm tra đơn vị. Tôi chỉ cố gắng tìm ra rằng những gì tôi đã hiểu là đúng.Kiểm tra đơn vị - Những gì không để kiểm tra

  1. Không kiểm tra bất kỳ thứ gì không liên quan đến logic. Ví dụ: Nếu có một phương thức trong lớp dịch vụ đơn giản gọi một phương thức khác trong lớp truy cập dữ liệu, không kiểm tra nó.

  2. Không kiểm tra hoạt động cơ sở dữ liệu cơ bản. Nếu tôi có một phương thức trong DAL đơn giản chèn một đối tượng trong cơ sở dữ liệu, hãy nói "public void save (Object object) {...}" và không có xử lý nào được thực hiện trên đối tượng nhận được từ lớp dịch vụ, kiểm tra nó.

  3. Tôi không cần xác thực đối tượng ở tất cả các lớp. Điều này có nghĩa là một trường nhất định trong một đối tượng không được rỗng, nói emailId trong đối tượng người dùng và điều này được xác minh và xác thực tại JSP (Sử dụng JS), tôi không cần kiểm tra phương thức DAL hoạt động như thế nào nếu nó nhận được emailId = NULL, vì lý tưởng nó không nên, và điều này nên được đưa về chăm sóc bởi JS.

Tôi còn gì khác không nên thử nghiệm?

+1

Đó là một câu hỏi rất phức tạp và tùy thuộc vào dự án. Kết luận phải là để kiểm tra các phương pháp của bạn và quyết định phương pháp nào trong số đó là tầm thường để được kiểm tra và phương pháp nào trong số đó đủ phức tạp để được kiểm tra. – flokra

Trả lời

5

Không kiểm tra bất kỳ thứ gì không thể thất bại.

Nhưng nhiều hơn cho điểm của bạn.

  1. Tất cả điều này phụ thuộc vào ý bạn là gì. Tôi lấy cách tiếp cận này trên một lớp bản đồ. Tôi đã không kiểm tra tất cả các mã nhàm chán mà sao chép các giá trị tài sản từ đối tượng A đến đối tượng B. Dán sao chép xấu và tôi đã sao chép một bản sao và bỏ lỡ một bản sao khác. Vấn đề lớn. Nhưng liệu nó có xứng đáng với tất cả mã thử nghiệm thêm không? Phụ thuộc vào những gì xảy ra khi ứng dụng không thành công. Trong trường hợp này, nó sẽ có giá trị mã thử nghiệm.

  2. Tương tự như điểm một. Vì vậy, Save là tốt đẹp và đơn giản, nhưng làm thế nào để bạn biết bạn đã làm những điều đơn giản đúng. Lộn xộn những người lên cũng chỉ là xấu như nhận được một chút logic kinh doanh sai.

  3. Bạn không muốn kiểm tra lại những thứ bạn đã thử nghiệm. Nhưng bạn nên vượt qua các bài kiểm tra đơn vị. Thực hiện kiểm tra tích hợp và hồi quy cũng như thử nghiệm đơn vị. Nó thực sự tốt đẹp khi tất cả các phần làm việc trong một chân không nhưng thổi lên khi đặt lại với nhau.

Thử nghiệm là hành động cân bằng. Nếu bạn thực sự kiểm tra tất cả các bạn có thể không bao giờ nhận được bất cứ điều gì khác được thực hiện. Nhưng nếu bạn không kiểm tra nó đủ bạn dành tất cả thời gian sửa lỗi của bạn. Nơi mà điểm cân bằng là thay đổi. Các loại dự án khác nhau có chi phí khác nhau cho việc thất bại. Trên một số dự án như một dự án có hiểu biết về người dùng nội bộ, bạn có thể chạy nhanh và nhanh, nhưng trong bao lâu? Cuối cùng, các mã không được kiểm tra bị ngắt, mất một lúc để tìm và bạn không thực hiện bất kỳ tiến trình nào.

Điều tốt nhất cần làm là theo đúng TDD. Đừng thử nghiệm vì lợi ích của thử nghiệm. Kiểm tra kỹ thuật thiết kế. Kiểm tra bởi vì nó ổ đĩa ra lỏng lẻo cùng mã. Kiểm tra vì có mã được thực hiện trong hai ngữ cảnh (kiểm thử và ứng dụng) làm cho mã tốt hơn. Một khi bạn đi xuống con đường của TDD bạn không hỏi những gì bạn nên và không nên kiểm tra. Thử nghiệm chỉ trở thành một phần của việc viết mã chứ không phải là một hoạt động độc lập.

+1

1. Mọi thứ đều thất bại - "điều này không thể thất bại" là những từ cuối cùng nổi tiếng ... 2. Mã C & P nhàm chán là thành viên chính để kiểm tra, vì nó kết nối với các lớp, như bạn đã nói. Không ở đây làm cho toàn bộ Phần mềm thất bại vì dữ liệu sai/thiếu được truyền qua. Vì điều này có vẻ là bên trong usecase chính là tốt, nó thực sự thực sự cần phải được kiểm tra. –

+0

@BeowulfOF 1. Đó là vấn đề. Đó là một câu trả lời thừa nhận rằng không kiểm tra những gì không thể thất bại. Đó là một quy tắc cũ có một hệ quả, bình thường, không có dấu hiệu rằng mọi thứ đều có thể thất bại. Thông thường khi bạn nói phần đầu tiên to lên theo cách bạn nói nó làm cho phần thứ hai rõ ràng. 2. Điểm của câu chuyện về mã dán bản sao là tôi đã phạm sai lầm lớn khi không thử nghiệm nó. Vì vậy, tôi đồng ý với bạn. –

0

Đợi, bởi JS bạn có nghĩa là JavaScript? Tôi giả sử bạn đang đề cập đến xác nhận phía khách hàng sau đó? Bạn không bao giờ nên giả định khách hàng xác nhận bất cứ điều gì khi xây dựng một trang web. JavaScript có thể bị vô hiệu hóa, các trang có thể được thay đổi hoặc giả mạo, v.v.

+0

Trên thực tế ... http://code.google.com/p/js-test-driver/ – Esko

+0

Bởi JS Tôi có nghĩa là JavaScript, nhưng nó giống như cố gắng xác định trách nhiệm của mỗi lớp, nó có thể là bộ điều khiển thay vì JS, tất cả những gì tôi muốn tìm ra là bạn có cần kiểm tra nếu một giá trị là null ở tất cả các lớp (Controller, Service và Dada Access), sẽ có quá nhiều mã trùng lặp hay nói cách khác lớp tiếp nhận thực sự bận tâm nếu nó không nhận được một đối tượng không hợp lệ khi nó lý tưởng và theo thỏa thuận sẽ không nhận được một đối tượng không hợp lệ –

0

Tôi không đồng ý với điểm của bạn. Bạn không nên viết các bài kiểm tra đơn vị dựa trên cách viết mã ngay bây giờ, nhưng để đảm bảo rằng trong tương lai, nếu một nhà phát triển khác đã thay đổi một số phần ngẫu nhiên của mã, anh ta có thể chạy chúng và tự tin rằng tất cả đều tốt.

Ví dụ: bạn có thể muốn kiểm tra phương thức đó đơn giản gọi một phương thức khác. Sau khi tất cả các bạn chỉ quan tâm rằng các phương pháp bên ngoài hoạt động, không phải như thế nào nó hoạt động. Nếu nhà phát triển tiếp theo thay đổi phương thức bên ngoài để không đơn giản như vậy nữa, anh ta sẽ thiếu một bài kiểm tra đơn vị.

Đây là lý do tại sao bạn nên sử dụng công cụ như NCover để đảm bảo rằng 100% mã của bạn được thực hiện trong các thử nghiệm đơn vị!

0

Nếu bạn có nội dung đã hoạt động, có thể không đáng để viết một loạt các bài kiểm tra xung quanh nó. Thông báo trước ở đây là nếu bạn cần thay đổi nó, hoặc mã sử dụng nó, thì những thử nghiệm đó là vô giá.

Vì không cần phải kiểm tra xử lý đầu vào không hợp lệ của DAL ... bạn cần phải tìm ra ranh giới dịch vụ của bạn là gì. Điều này thực sự phụ thuộc. Nếu bạn không thể kiểm soát được máy khách, thì bạn cần phải kiểm tra rằng các kỳ vọng của máy chủ của bạn đang được đáp ứng (ở một số lớp).

3

Trả lời đơn giản - không có gì

Trả lời phức tạp - bạn không nên kiểm tra những điều bạn không có thời gian. Thử nghiệm được thúc đẩy bởi một kế hoạch phức tạp của các bài kiểm tra cần thiết và giá cả phải chăng, ưu tiên cho các phần quan trọng nhất và quy trình công việc của hệ thống phần mềm. Càng có nhiều thời gian để thử nghiệm, thì càng có nhiều giai đoạn có thể được kiểm tra.

Trong đơn vị Kiểm tra đơn giản, mọi đơn vị, trong OOP mỗi lớp đều có kiểm tra riêng. Kiểm tra đơn giản tất cả mọi thứ với các giá trị min, max, usecases trung bình và thực hiện các kiểm tra negativ - các thử nghiệm phải thất bại nếu phần mềm hoạt động chính xác. Kiểm tra errorhandling là tốt.

Xem ITSQB để biết thêm chi tiết về chủ đề đó

0

Tôi không đơn vị -thử nghiệm bất cứ điều gì, bởi vì thay vào đó tôi muốn hội nhập và/hoặc hệ thống xét nghiệm để:

  • Che mã số
  • Tự động
  • Được sử dụng và hữu ích như, các đơn vị tes ts

Để biết chi tiết, xem Should one test internal implementation, or only test public behaviour?

Đảo ngược câu hỏi của bạn, tôi đề nghị rằng mã duy nhất mà bạn nên đơn vị kiểm tra là mã:

a) Mà sẽ không được kiểm tra tại tất cả bằng cách tích hợp và/hoặc kiểm tra hệ thống (và nếu không, tại sao không?)

b) Hoặc mà nên, vì lý do gì, được kiểm tra trước khi thử nghiệm hội nhập/hệ thống (có lẽ vì thế mà sự phát triển của dự án của bạn được phân chia cho một số nhà phát triển song song)

15

Tôi không chắc chắn Tôi có thể đồng ý với bất kỳ ngoại lệ nào bạn đề cập trong câu trả lời của mình.

phương pháp không liên quan đến luận

Thậm chí nếu một phương pháp đơn giản chỉ là các đại biểu thực hiện một sự phụ thuộc bên trong, nó rất phù hợp để xác minh rằng nó sẽ xảy ra. Tôi đoán rằng bạn viết mã cho một lý do, vì vậy bạn cần phải viết một bài kiểm tra đảm bảo rằng nó vẫn như vậy.

Hãy nhớ rằng một trong những lợi ích chính của các bài kiểm tra đơn vị là các bộ kiểm tra hồi quy. Kiểm tra rằng một phụ thuộc bên trong đang được gọi một cách chính xác được gọi là Kiểm tra tương tác. Giả sử bạn có phương pháp sau:

public void Save(Entity entity) 
{ 
    this.repository.Save(entity); 
} 

Điều rất quan trọng là kiểm tra phương thức Lưu của kho được gọi với đầu vào chính xác. Nếu không, một số nhà phát triển khác có thể đến cùng vào một ngày sau đó và xóa dòng mã đó và bộ kiểm tra hồi quy sẽ không cảnh báo bạn.

Hãy nhớ rằng: Những điều đơn giản không được đảm bảo để đơn giản.

Không thử nghiệm hoạt động cơ sở dữ liệu

Bạn có thấy nó không quan trọng cho dù dữ liệu đang được tồn một cách chính xác trong cơ sở dữ liệu? Nếu bạn thực sự, thật sự, đừng quan tâm, thì bạn không cần phải kiểm tra nó - bằng không bạn làm.

Nếu bạn không kiểm tra hoạt động cơ sở dữ liệu của mình, làm thế nào để bạn biết rằng thành phần truy cập dữ liệu của bạn hoạt động?

Tôi không nói rằng bạn nên kiểm tra thư viện ORM của mình, nhưng bạn nên kiểm tra xem nó có đang được sử dụng đúng cách không.

Không kiểm tra đối tượng trong tất cả các lớp

Tôi không chắc chắn những gì bạn có ý nghĩa bởi câu hỏi này, nhưng nếu một lĩnh vực có thể được null, và đây là một vấn đề, bạn cần phải kiểm tra những gì sẽ xảy ra khi nó là, trên thực tế, null - ở khắp mọi nơi.

Sau đó, bạn nên thiết kế API để các giá trị được đảm bảo không bị rỗng.

Kết luận

Bạn nên kiểm tra tất cả mọi thứ bạn có thể thử nghiệm. Không có ngoại lệ. Những điều đơn giản không đơn giản, và bạn cần phải có khả năng xác minh mã đó khi đã làm việc liên tục.

Có những thứ (chẳng hạn như giao diện người dùng) mà bạn không thể kiểm tra đơn vị và chúng phải được trừu tượng hóa để chúng chứa ít logic nhất có thể, nhưng mọi thứ khác cần được kiểm tra.

Phát triển theo hướng thử nghiệm (TDD) là cách tốt nhất để đảm bảo điều này xảy ra.

+0

+1 "Phát triển theo hướng thử nghiệm (TDD) là cách tốt nhất để đảm bảo điều này xảy ra". – Juri

+8

Tôi nghĩ rằng bạn hiểu lầm hoặc đánh giá sai OP: anh ấy không nói "không thử nghiệm công cụ này", anh ấy nói, "không * đơn vị * -test nó". Rất nhiều người (như bạn) dường như nói về kiểm thử đơn vị như thể kiểm tra đơn vị là loại thử nghiệm duy nhất có (và/hoặc loại thử nghiệm tự động duy nhất), và vì lý do đó, các bài kiểm tra đơn vị đã vượt quá được xếp hạng. – ChrisW

+0

@ Chris: Không, tôi không nghĩ rằng thử nghiệm đơn vị là loại thử nghiệm duy nhất có, nhưng nó là loại mạnh mẽ và hiệu quả nhất. Xem http: // stackoverflow.com/questions/1316101/automatic-unit-testing-why-what-which/1316209 # 1316209 để xây dựng. –

1

Nói chung nếu có thể tôi sẽ đi theo kiểu TDD. Điều này rất khó đạt được và cần rất nhiều kỷ luật, nhưng nếu bạn có nó, bạn sẽ không bao giờ muốn quay trở lại. Btw, TDD không chỉ là về thử nghiệm, mà còn là về thiết kế phần mềm (cũng có thể được gọi là Test-Driven-Design). Thiết kế của bạn phát triển theo các bài kiểm tra của bạn.

Đánh dấu đã đưa ra một câu trả lời khá tốt cho những phát biểu của bạn về những điều KHÔNG THỬ NGHIỆM.

Tôi không cần xác thực đối tượng tại tất cả các lớp. Điều này có nghĩa là một trường nhất định trong một đối tượng không được rỗng, giả sử emailId trong Đối tượng người dùng và này được xác minh và xác thực tại JSP (Sử dụng JS), tôi không cần phải thử nghiệm cách thức DAL cư xử nếu nó nhận emailId = NULL, vì lý tưởng là không nên, và điều này phải là được JS chăm sóc.

Trong một ứng dụng được phân lớp, có thể xảy ra rằng bạn có hai loại điểm "đầu vào"/đầu vào cho ứng dụng của mình. Một có thể là giao diện người dùng web bình thường, một giao diện người dùng khác có thể là dịch vụ web được một số ứng dụng khác sử dụng (có thể là ứng dụng dành cho máy tính để bàn). Vì vậy, tất cả các logic liên quan đến xác nhận nên (cũng) được kiểm tra trong lớp kinh doanh (vì xác nhận hợp lệ có thể là một phần của logic nghiệp vụ).

1

Không đơn vị kiểm tra khuôn khổ .NET. Theo đó, ý tôi là, đừng kiểm tra những thứ thuộc trách nhiệm của Microsoft.

Ví dụ: không bận tâm kiểm tra bộ định vị và getters - trừ khi có mã thực sự được bao gồm ở đó.

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