Cách tốt nhất để tổ chức các bài kiểm tra đơn vị của chúng tôi là gì


18

Chúng tôi đã xây dựng một số lượng đáng kể các bài kiểm tra đơn vị cho chương trình chính của chúng tôi trong những năm qua. Vài ngàn. Vấn đề là chúng ta không có ý tưởng rõ ràng về những thử nghiệm mà chúng ta có vì có rất nhiều. Và đó là một vấn đề bởi vì chúng tôi không biết chúng tôi yếu ở đâu trong các bài kiểm tra (hoặc nơi chúng tôi có các bản sao).

Ứng dụng của chúng tôi là một công cụ báo cáo. Vì vậy, bạn có thể có một mẫu được sử dụng để kiểm tra phân tích cú pháp (chúng ta có đọc tất cả các thuộc tính của bảng không), hợp nhất trong dữ liệu (chúng ta có giữ các thuộc tính bảng chính xác trong hợp nhất không), định dạng trang cuối cùng (là bảng được đặt chính xác trên trang ) và / hoặc định dạng đầu ra (là tệp DOCX được tạo chính xác).

Thêm vào đây những gì chúng ta cần kiểm tra. Lấy phần đệm xung quanh một ô của bảng (chúng tôi sử dụng Word, Excel và PowerPoint cho thiết kế báo cáo). Chúng ta phải kiểm tra phần đệm qua ngắt trang, đối với một bảng bên trong một ô, các ô được hợp nhất theo chiều dọc, các ô được hợp nhất theo chiều ngang, một ô được hợp nhất theo chiều dọc và chiều ngang có chứa một bảng với các ô được hợp nhất theo chiều dọc và chiều ngang trong bảng bên trong, trong đó bảng đó phá vỡ trên một trang.

Vì vậy, loại kiểm tra đó đi vào? Bảng đệm, ngắt trang, các ô được lồng, các ô được hợp nhất theo chiều dọc, các ô được hợp nhất theo chiều ngang, hoặc cái gì khác?

Và làm thế nào để chúng tôi ghi lại các loại này, đặt tên cho các bài kiểm tra đơn vị, vv?

Cập nhật: Một số người đã đề xuất sử dụng các công cụ bảo hiểm để xác minh rằng chúng tôi có bảo hiểm đầy đủ. Thật không may, đó là việc sử dụng hạn chế trong trường hợp của chúng tôi vì các lỗi có xu hướng là do các kết hợp cụ thể nên mã đó đã được kiểm tra, nhưng không phải trong kết hợp đó.

Ví dụ: hôm qua chúng tôi đã có một khách hàng bắt đầu đánh dấu Word ở cuối vòng lặp forEach trong mẫu của họ (tài liệu Word) và kết thúc nó ở đầu vòng lặp forEach tiếp theo. Tất cả mã được sử dụng này có các bài kiểm tra đơn vị chống lại nó, nhưng chúng tôi đã không nghĩ đến việc kết hợp một mẫu mở rộng dấu trang bắt đầu 25 lần, sau đó kết thúc 10 lần (hai vòng lặp forEach có số lượng hàng khác nhau).


1
Có vẻ như câu hỏi của bạn thực sự, Làm sao chúng tôi biết chúng tôi đã thử nghiệm một kịch bản cụ thể?
Andy Wiesendanger

Đúng! Và cũng là nơi kiểm tra cho bất kỳ kịch bản tương tự. Và từ đó chúng tôi có được nhu cầu số 2 - đọc những gì được bảo hiểm giúp chúng tôi tìm thấy những gì chúng tôi đã bỏ lỡ.
David Thielen

Câu trả lời:


13

Nói chung, tôi có xu hướng phản chiếu cây nguồn cho các bài kiểm tra đơn vị của tôi. Vì vậy, nếu tôi có src / lib / fubar, tôi sẽ có một bài kiểm tra / lib / fubar có chứa các bài kiểm tra đơn vị cho fubar.

Tuy nhiên, những gì bạn dường như được mô tả là các bài kiểm tra chức năng nhiều hơn. Trong trường hợp đó, tôi sẽ có một bảng đa chiều liệt kê tất cả các điều kiện có thể của bạn. Sau đó, những người không có xét nghiệm là vô nghĩa hoặc cần một thử nghiệm mới. Tất nhiên, bạn có thể đặt chúng trong các bộ thử nghiệm.


Chúng tôi hiện phản ánh cây nguồn. Nhưng chúng tôi có hai vấn đề. Đầu tiên, để định dạng bảng, có hơn 100 thử nghiệm khác nhau. Theo dõi những gì chính xác được thử nghiệm đã trở thành một vấn đề. Thứ hai, các khu vực chức năng rất khác nhau cần kiểm tra các bảng - trình phân tích cú pháp, thay thế dữ liệu, định dạng và tạo tài liệu đầu ra. Vì vậy, tôi nghĩ rằng bạn đúng, theo một nghĩa nào đó, đó là thử nghiệm chức năng của một tài sản nhất định.
David Thielen

Điều đó dẫn đến câu hỏi, chúng ta lưu trữ bảng kiểm tra ở đâu? Tôi đang nghĩ một bảng tính trong thư mục nguồn gốc ???
David Thielen

Tôi sẽ lưu trữ nó trong một bảng tính được kiểm soát phiên bản trong thư mục thử nghiệm. Nếu bạn có rất nhiều thứ bạn cần kiểm tra, chia nó thành các cấu trúc meta sẽ có lợi. Hãy thử suy nghĩ về những điều chung chung đang được thử nghiệm thay vì những gì hoặc làm thế nào.
Sardathrion - Phục hồi Monica

7

Cấu trúc phổ biến nhất dường như là gương srctestthư mục.

src/module/class
test/module/class_test

Tuy nhiên, có một cấu trúc thay thế mà tôi đã thấy mà bây giờ tôi tin là tốt hơn.

src/module/class
src/module/class_test

Vì kiểm thử đơn vị có xu hướng phản chiếu lớp mà chúng đang kiểm tra, việc đặt chúng vào cùng một thư mục giúp truy cập dễ dàng hơn vào các tệp để bạn có thể làm việc ở cả hai bên.


2
Một nhược điểm từ cách tiếp cận trước đây là mỗi lần bạn quyết định thay đổi cấu trúc tệp của dự án, bạn phải làm tương tự cho cấu trúc thử nghiệm. Vấn đề này không tồn tại nếu các bài kiểm tra là nơi mã.
chiến thắng175

5

Trong .NET, tôi có xu hướng phản chiếu, hoặc ít nhất là gần đúng, cấu trúc không gian tên cho mã nguồn trong các dự án thử nghiệm, bên dưới một không gian tên chính "Tests.Unit" hoặc "Tests.Integration". Tất cả các thử nghiệm đơn vị đi trong một dự án, với cấu trúc cơ bản của mã nguồn được sao chép dưới dạng các thư mục trong dự án. Tương tự cho các bài kiểm tra tích hợp. Vì vậy, một giải pháp đơn giản cho một dự án có thể như thế này:

Solution
   MyProduct.Project1 (Project)
      Folder1 (Folder)
         ClassAA (Class def)
         ...
      Folder2
         ClassAB
         ...
      ClassAC
      ...
   MyProduct.Project2
      Folder1
         ClassBA
         ...
      ClassBB
      ...
   ...
   MyProduct.Tests.Unit
      Project1
         Folder1
            ClassAATests
            ClassAATests2 (possibly a different fixture setup)
         Folder2
            ClassABTests
         ClassACTests
      Project2
         Folder1
            ClassBATests
         ClassBBTests
      ...
   MyProduct.Tests.Integration
      Project1 (a folder named similarly to the project)
         Folder1 (replicate the folders/namespaces for that project beneath)
            ClassAATests
         Folder2
            ClassABTests
         ClassACTests
      Project2
         Folder1
            ClassBATests
         ClassBBTests

Đối với bất kỳ AAT hoặc AEET nào được mã hóa bằng khung kiểm tra đơn vị, điều này thay đổi một chút; thông thường những bài kiểm tra này phản ánh một tập hợp các bước, sẽ kiểm tra chức năng của ca sử dụng hoặc câu chuyện mới. Tôi thường cấu trúc các thử nghiệm này trong một MyProduct.Tests.Acceptancedự án như vậy, với các thử nghiệm cho từng câu chuyện, có thể được nhóm theo cột mốc hoặc câu chuyện "sử thi" mà câu chuyện đang được phát triển thuộc về. Tuy nhiên, đó thực sự chỉ là các thử nghiệm tích hợp uber, và vì vậy nếu bạn muốn cấu trúc các thử nghiệm theo hướng hướng đối tượng hơn thay vì theo hướng câu chuyện, bạn thậm chí không cần một MyProduct.Tests.Acceptancedự án tương tự; chỉ cần ném em vào trong MyProduct.Tests.Integrationphạm vi của đối tượng cấp cao nhất đang thử nghiệm.


3

Không có lý do cho một bài kiểm tra đơn vị chỉ trong một thể loại. Tất cả các bộ công cụ kiểm tra đơn vị chính đều hỗ trợ việc tạo các bộ kiểm thử , gói kiểm tra cho một danh mục cụ thể. Khi một khu vực mã cụ thể đã được thay đổi, nhà phát triển nên chạy bộ đó trước và thường xuyên để xem những gì đã bị hỏng. Khi một bài kiểm tra liên quan đến việc đệm phá vỡ làm tổ, bằng mọi cách, hãy đặt nó vào cả ba bộ.

Điều đó nói rằng, quan điểm của các bài kiểm tra đơn vị là chạy chúng mọi lúc, tức là chúng phải nhỏ và đủ nhanh để có thể chạy tất cả chúng trước khi thực hiện bất kỳ mã nào. Nói cách khác, việc kiểm tra là loại thực sự không quan trọng, nó nên được chạy trước khi thực hiện. Suites thực sự chỉ là một cái nạng mà bạn sử dụng nếu vì lý do nào đó bạn không thể viết bài kiểm tra nhanh nhất có thể.

Đối với phạm vi bảo hiểm, có các công cụ bảo hiểm rất tốt cho bạn biết bao nhiêu phần trăm dòng thực sự được thực hiện bằng cách chạy thử nghiệm của bạn - đây là một con trỏ rõ ràng cho loại thử nghiệm bạn vẫn còn thiếu.

Đối với việc đặt tên, không có giá trị cụ thể trong nỗ lực mở rộng tên của các bài kiểm tra đơn vị. Tất cả những gì bạn muốn nghe từ các bài kiểm tra của bạn là "5235 trong số 5235 bài kiểm tra đã qua". Khi một bài kiểm tra thất bại, những gì bạn đọc không phải là tên của nó, mà là thông điệp , ví dụ như Chuỗi trong assert()đó thực hiện phê bình thành công của bạn. Thông điệp phải đủ thông tin để bạn có ý tưởng về những gì sai mà không cần đọc nội dung của bài kiểm tra. Cái tên không quan trọng so với điều đó.


Đồng ý 100% với tất cả những gì bạn nói (máy xây dựng của chúng tôi chạy tất cả các thử nghiệm khi đăng ký). Vấn đề lớn của chúng tôi là theo dõi những gì chúng tôi đang thử nghiệm. Và bảo hiểm mã không có nhiều trợ giúp (xem cập nhật ở trên).
David Thielen

1

Một cách để biết bạn có yếu trong các bài kiểm tra hay không là truy xuất nguồn gốc. Thông thường cho các bài kiểm tra, điều này có hình thức bảo hiểm.

Mục đích là để đo các phần nào của mã được thực hiện bởi các thử nghiệm của bạn, để bạn có thể thấy mã không nằm trong các thử nghiệm của mình. Tùy thuộc vào bạn (và công cụ bảo hiểm) để xác định "một phần của mã" là gì. Ít nhất là bảo hiểm chi nhánh.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.