Tôi có phải là Kiểm tra đơn vị hoặc Kiểm tra tích hợp Các thủ tục được lưu trữ của tôi không?


8

Gần đây tôi đã có nhiều lần cần thiết để duy trì các thủ tục và chức năng được lưu trữ phức tạp. Chúng đã bị hỏng, thường là theo những cách khá tinh tế - có rất ít trường hợp bạn sẽ gọi SP với các tham số hợp lệ và nó hoàn toàn không hoạt động.

Giải pháp của tôi là phát triển một khung hình thực thi các thủ tục được lưu trữ trong một giao dịch, sau khi khởi tạo cơ sở dữ liệu theo các điều kiện ban đầu tôi cần, sau đó kiểm tra kết quả mong đợi, cũng trong cùng một giao dịch. Giao dịch đã được khôi phục vào cuối thử nghiệm.

Điều này đã làm việc rất tốt. Nhưng một số người sẽ gọi đây là "thử nghiệm tích hợp" vì nó liên quan đến việc tích hợp với cơ sở dữ liệu. Tôi gọi nó là thử nghiệm đơn vị, vì tôi đã thử nghiệm các thành phần riêng lẻ và các trường hợp thử nghiệm riêng lẻ cho các thành phần đó và vì tôi hoàn toàn kiểm soát trạng thái ban đầu của cơ sở dữ liệu.

Nhưng dòng nên được vẽ ở đâu? Đây là thử nghiệm tích hợp hoặc thử nghiệm đơn vị? Có một lý do thực tế tại sao loại thử nghiệm này là một ý tưởng tồi? Nếu đây là thử nghiệm tích hợp "duy nhất", có ai có đề xuất về cách thực hiện "thử nghiệm đơn vị" thực tế trên các quy trình được lưu trữ này không?


Cập nhật, 3 năm rưỡi sau. Trong dự án hiện tại của tôi, tôi đã bắt đầu sử dụng các bài kiểm tra đơn vị SSDT, với thành công, mặc dù chúng có thể tốt hơn. Xem Xác minh mã cơ sở dữ liệu bằng cách sử dụng các bài kiểm tra đơn vị SQL Server . Chúng thường triển khai dự án cơ sở dữ liệu tới phiên bản SQL Server LocalDB của bạn, do đó, việc này sẽ xóa mọi câu hỏi về môi trường cơ sở dữ liệu ảnh hưởng đến kiểm tra. Tôi điền vào cơ sở dữ liệu các dữ liệu cần thiết trong Thử nghiệm trước, để loại bỏ các câu hỏi về nội dung cơ sở dữ liệu. Trên thực tế, tôi sử dụng các câu lệnh MERGE để làm điều này, đảm bảo rằng mọi dữ liệu tôi không cần cho bài kiểm tra hiện tại sẽ bị xóa, chèn hoặc cập nhật từ cơ sở dữ liệu trước khi kiểm tra. Họ có vấn đề:

  • Họ không nhanh
  • Không thể sử dụng lại các điều kiện kiểm tra
  • Không thể sử dụng lại các thử nghiệm trước (trừ khi bạn làm cho chúng chung cho tất cả các thử nghiệm trong một dự án)
  • Giao diện người dùng có thể được cải thiện

Một trong những lý do cho các vấn đề trên là tôi chưa phàn nàn về chúng. Tôi khuyên mọi người quan tâm nên thử tính năng này và sau đó phàn nàn về nó. Đó là cách cải tiến được thực hiện.


1
Tại sao nó sẽ là một oxymoron ?
doppelgreener

Câu hỏi hay. Bạn nghĩ gì về việc thay đổi tiêu đề? Có lẽ đại loại như thế này: "Cách kiểm tra các thủ tục được lưu trữ"
Matthew Rodatus

@Matthew: "hợp tác chỉnh sửa"
John Saunders

Câu trả lời:


7

Quan điểm của thử nghiệm đơn vị không phải là để làm cho một phép thử đơn vị ma thuật đến và xác thực ý kiến ​​của bạn. Đó là để kiểm tra các khối xây dựng nhỏ nhất, đơn giản nhất trong hệ thống của bạn, vì vậy bạn không kiểm tra một số chức năng mở rộng hơn và vấp ngã vì một cái gì đó không hoạt động theo cách bạn nghĩ. Vì vậy, bạn có thể phá vỡ điều này hơn nữa? Tôi không nghĩ bạn có thể, trong trường hợp này:

(a) Nghe có vẻ như là một bài kiểm tra đơn vị đối với tôi và (b) Không quan trọng đó có phải là bài kiểm tra đơn vị hay không, bởi vì nó kiểm tra những gì bạn cần kiểm tra, đó là điểm sử dụng bài kiểm tra đơn vị ở nơi đầu tiên!

Nếu bạn cảm thấy các thủ tục quá phức tạp, bạn có thể muốn chia chúng thành các phần nhỏ hơn (trong thủ tục cơ sở dữ liệu hoặc mã), nhưng để làm được điều đó, rõ ràng bạn muốn thực hiện các thử nghiệm này trước tiên!


7

Kiểm thử đơn vị theo định nghĩa xoay quanh việc kiểm tra "đơn vị" mã trong môi trường hoặc nền tảng đang chạy của nó. Nền tảng bạn sử dụng là một cơ sở dữ liệu để bạn phải sử dụng nó, nó không tích hợp.

Một câu hỏi tốt hơn là tại sao bạn quan tâm. Miễn là nó tự động và thêm giá trị, bạn có quan tâm rằng thử nghiệm của bạn trong thử nghiệm đơn vị, thử nghiệm chấp nhận, thử nghiệm khói hoặc thử nghiệm chức năng không?

Trong công việc của tôi, chúng tôi hiện đang tận dụng khung thử nghiệm đơn vị để thực hiện Phát triển dựa trên thử nghiệm chấp nhận (ATDD). Một số bài kiểm tra là tích hợp, một số thì không. Hầu như không ai trong số họ là bài kiểm tra đơn vị, nhưng chúng tôi không quan tâm miễn là:

  • kiểm tra thêm giá trị
  • bài kiểm tra không có thất bại hoặc thành công sai (chủ yếu là xác định)
  • kiểm tra là tự động

Cập nhật

Đó là tất cả một câu hỏi về chi phí và lợi ích. Càng nhiều bộ phận chuyển động, bạn có nguy cơ có một bài kiểm tra không xác định càng cao. Các thử nghiệm đơn vị cổ điển có số lượng bộ phận chuyển động ít nhất, và do đó ít có khả năng là không xác định. Sự cân bằng là bạn không kiểm tra các điểm tích hợp (mã, cơ sở dữ liệu, fs, mạng, v.v.). Tất cả những điều này là hữu ích để được bảo hiểm trong một thử nghiệm, miễn là nguy cơ thất bại hoặc thành công là đủ thấp.

Các xét nghiệm cung cấp giá trị trong những gì họ không phải là những gì họ đang có. Điều quan trọng là mức độ thường xuyên bạn sẽ có những thất bại và thành công sai lầm. Nếu tôi có lỗi sai trong 2 giờ mỗi tháng vì đó là cửa sổ bảo trì cho mạng, thì giá trị của các thử nghiệm là rõ ràng. Khi họ thất bại, rõ ràng có điều gì đó không ổn với tài nguyên được nối mạng, không phải là một thử nghiệm cụ thể. Và bây giờ bạn có phạm vi kiểm tra chính xác hơn vì bạn đang kiểm tra các điểm tích hợp đó.


Một trong những lý do tôi quan tâm là một số nơi sẽ khiếu nại nếu kiểm tra đơn vị của bạn không "kiểm tra đơn vị" theo định nghĩa của họ. Một lý do khác là nó xuất hiện trong các bình luận về " Liệu một sự tồn tại giữa mặt đất? (Kiểm thử đơn vị so với Kiểm tra tích hợp) "
John Saunders

@John Dựa trên câu trả lời của @ dietbuddha và nghiên cứu tôi đã đọc: Bởi vì bạn đang sử dụng ngăn xếp mạng và máy chủ DB, các thử nghiệm của bạn không "chủ yếu mang tính quyết định". Chúng không nên được phân loại là thử nghiệm đơn vị. Nhưng tất nhiên đó chỉ là ý kiến ​​của tôi.
Matthew Rodatus

1
@Matthew: Tôi không biết bạn phát triển nền tảng nào, nhưng tôi đảm bảo với bạn rằng ngăn xếp mạng và máy chủ cơ sở dữ liệu tôi sử dụng không thường xuyên bị lỗi. Trong thực tế, thất bại của các thành phần này có thể được bỏ qua cho mục đích thử nghiệm.
John Saunders

@ John Saunders: câu trả lời được cập nhật
dietbuddha

2

Tôi nghĩ rằng nó phụ thuộc vào nơi dữ liệu đến từ. Nếu bạn đang tạo điều kiện kiểm tra của mình trong tiền tố kiểm tra, tôi nghĩ việc gọi nó là kiểm tra đơn vị là hợp lý. Mặt khác, bạn đang tranh luận về sự kén chọn về những gì được coi là "tồn tại trước" cho một bài kiểm tra đơn vị. Giống như các kiểm tra đơn vị cơ sở dữ liệu của bạn dựa trên sự tồn tại của các bảng cơ sở dữ liệu, v.v., các kiểm tra đơn vị bên ngoài cơ sở dữ liệu dựa trên những thứ như định nghĩa lớp và thường là các trường hợp của các cụm. Điều đó không tệ, nó thực tế.


1

Tôi sẽ coi đó là thử nghiệm tích hợp:

  1. Nó chậm hơn nhiều so với một bài kiểm tra đơn vị.
  2. Nó không thực hiện một đơn vị mã nguyên tử duy nhất - nó thực hiện thủ tục của bạn, máy chủ cơ sở dữ liệu, ngăn xếp mạng, v.v.
  3. Sẽ không dễ dàng phát hiện lỗi xảy ra ở đâu nếu thử nghiệm thất bại. Bạn sẽ phải xem xét từng lỗi một cách thủ công để xem đó là lỗi hệ thống bên ngoài hay mã của bạn.

Tuy nhiên, các bài kiểm tra như bạn mô tả là vô giá để có. Gần đây chúng tôi đã bắt đầu thêm các bài kiểm tra như thế, để kiểm tra các quy trình được lưu trữ không thể kiểm tra thủ công trong một số môi trường nhất định. Tôi không biết một cách khác để có các bài kiểm tra tự động cho các thủ tục được lưu trữ.

Vì vậy, các thử nghiệm này là một ý tưởng tuyệt vời, nhưng gọi chúng là các thử nghiệm tích hợp - sử dụng một loại thử nghiệm hoặc hậu tố tên để phân biệt chúng với các thử nghiệm đơn vị thông thường. Bằng cách này, bạn có thể gắn cờ các lỗi thử nghiệm tích hợp khác với các lỗi thử nghiệm đơn vị trong tự động hóa bản dựng của bạn.


@Matthew: Tôi không kiểm tra máy chủ cơ sở dữ liệu hoặc ngăn xếp mạng, nhiều hơn tôi kiểm tra .NET BCL hoặc CLR. Ngoài ra, tôi đã không gặp rắc rối ở tất cả các thất bại nội địa hóa. Có lẽ tôi nên đưa ra một ví dụ chi tiết hơn về loại bài kiểm tra mà tôi muốn nói.
John Saunders

@ John Khi tôi nói "kiểm tra máy chủ cơ sở dữ liệu và ngăn xếp mạng", ý tôi là bạn đang kiểm tra bất kỳ mã nào bạn đang thực hiện. .NET BCL / CLR phải có vé vào bài kiểm tra đơn vị - bạn không thể viết mã mà không có chúng! Nhưng, một bài kiểm tra nói chuyện với máy chủ cơ sở dữ liệu cũng đang thực hiện (tức là kiểm tra) máy chủ và mạng. Tôi đoán tôi nên hỏi: Làm thế nào bạn đang chạy thử nghiệm thủ tục của bạn? Từ một phương pháp kiểm tra đơn vị C #? Một tập lệnh SQL? Làm thế nào để bạn tự động hóa báo cáo kết quả?
Matthew Rodatus

@Matthew: một bài kiểm tra NUnit bình thường của một phương thức trong lớp của tôi đang thực hiện .NET Framework, theo định nghĩa của bạn. Không phải của tôi, vì tôi giả sử rằng .NET hoạt động. Tương tự, tôi giả định rằng SQL Server hoạt động và SqlCommandlớp hoạt động và vận chuyển TCP hoạt động. Tôi chưa sai về những điều đó.
John Saunders

1
@Matthew: nếu SQL Server và các tính năng vận chuyển và tính năng tích hợp sẵn của nó không hoạt động, thì tôi đã gặp vấn đề lớn hơn so với việc tôi đang thử nghiệm đơn vị hay thử nghiệm tích hợp. Tôi thường cho rằng HĐH cũng hoạt động tốt và tốc độ ánh sáng ít nhiều không đổi trong các khung mà các thử nghiệm của tôi hoạt động.
John Saunders

1
@ John Tôi không nghĩ bạn hiểu ý tôi, nhưng ồ.
Matthew Rodatus

0

Đây là thử nghiệm tích hợp hoặc thử nghiệm đơn vị?

Trường hợp chạy thử? Trên cơ sở dữ liệu hoặc thông qua khai thác thử nghiệm dựa trên mã (JUnit)?

Trên cơ sở dữ liệu sau đó có khả năng là một thử nghiệm đơn vị (vì nó là độc lập), khai thác thử nghiệm giống như JUnit sau đó nó kết nối với cơ sở dữ liệu bên ngoài và như một thử nghiệm tích hợp.

Nếu đây là thử nghiệm tích hợp "chỉ"

Tại sao báo giá? Kiểm tra tích hợp không phải là một loại quái vật bạn không bao giờ nên làm.

có ai có đề xuất về cách thực hiện "kiểm tra đơn vị" thực tế trên các thủ tục được lưu trữ này không?

Tôi thường tìm thấy đơn vị hợp lý duy nhất cho một thủ tục được lưu trữ là mã gọi và thủ tục. Vì vậy, tôi tích hợp kiểm tra bộ hoàn chỉnh trong một tập hợp các bài kiểm tra trông giống như kiểm tra đơn vị.

Một câu hỏi tốt hơn là tại sao bạn quan tâm [về tên].

Vì nó cho phép bạn tách các bài kiểm tra ra. Kiểm thử tích hợp mất nhiều thời gian hơn để chạy, yêu cầu thiết lập bổ sung và có khả năng truy cập vào tài nguyên được chia sẻ bởi nhiều thử nghiệm (ví dụ: cơ sở dữ liệu).

1) Mã cuộc gọi sẽ có các bài kiểm tra đơn vị bổ sung nếu được yêu cầu.


Không có thiết lập bổ sung. Tất cả các thiết lập là trong thử nghiệm chính nó. Ngoài ra, các xét nghiệm này là khá nhanh. Việc chuẩn bị trong phần mở đầu thử nghiệm cho đến nay không cần thiết phải thực hiện nhiều hơn xóa 50 hàng và sau đó chèn thêm hàng tá.
John Saunders

Nó khởi động cơ sở dữ liệu nếu không chạy?
mlk

"Bắt đầu một cơ sở dữ liệu"? Không, các kiểm tra sử dụng chuỗi cấu hình được lưu trữ trong tệp cấu hình cho các kiểm tra và một giả định rằng một khi chuỗi cấu hình phù hợp được xác định, nó sẽ tiếp tục tham chiếu đến cơ sở dữ liệu hợp lệ trong máy chủ cơ sở dữ liệu hợp lệ. Trong một thế giới lý tưởng, các thử nghiệm này có thể chạy sau khi triển khai (tạo) một phiên bản mới của cơ sở dữ liệu, sử dụng DDL hiện tại, cũng được lưu trữ trong kiểm soát nguồn. Chúng tôi đang làm việc hướng tới lý tưởng đó.
John Saunders

Đó là một lý tưởng tốt để có được. Tôi đã làm việc theo cùng một thời gian. Quan điểm của tôi là bạn có nhiệm vụ khởi động (bắt đầu cơ sở dữ liệu). Bạn có thể (và nên) làm cho các bài kiểm tra của mình không bị thất bại (Khẳng định. Không thể kết luận bằng MSTest) nếu các tác vụ chưa được thực hiện. Khu vực này của thử nghiệm một khu vực màu xám của thử nghiệm đơn vị. Viết các bài kiểm tra giống như Bài kiểm tra đơn vị, nhưng chấp nhận chúng là các bài kiểm tra tích hợp.
mlk

1
Tôi không chắc ý của bạn là gì khi khởi động cơ sở dữ liệu. Trong "thế giới lý tưởng" của tôi, việc triển khai một bản sao mới, trống của cơ sở dữ liệu sẽ là một phần của bản dựng tự động, không phải là một phần của các thử nghiệm.
John Saunders

-1

Microtest là một thuật ngữ hữu ích có thể giúp bạn vượt qua cuộc tranh luận về thuật ngữ và liệu bài kiểm tra của bạn có phải là bài kiểm tra đơn vị hay không.

Một định nghĩa chung về kiểm tra đơn vị bao gồm hệ thống được kiểm tra là một đơn vị chức năng nhỏ và bạn phải có thể chạy tất cả các kiểm tra đối với nó trong bộ nhớ, mà không cần sự trợ giúp từ các hệ thống tệp, mạng hoặc công cụ cơ sở dữ liệu . Nếu bạn cần một công cụ cơ sở dữ liệu thực tế để chạy nó, thì đó không phải là một bài kiểm tra đơn vị.

Mặc dù định nghĩa này hoạt động rất tốt cho tất cả các lớp ứng dụng, nhưng nó không hữu ích cho lớp truy cập cơ sở dữ liệu nội địa. Chúng tôi phải nhận ra rằng nó là đặc biệt. Nếu các thử nghiệm của bạn chỉ kiểm tra các đơn vị nhỏ chức năng lưu trữ / truy xuất / cập nhật / xóa, thì các thử nghiệm của bạn rõ ràng có giá trị như các thử nghiệm đơn vị "nghiêm ngặt" được viết đối với các lớp trên của hệ thống.


Đây là nơi tồn tại tranh cãi: Tôi không kiểm tra DAL: Tôi đang kiểm tra các thủ tục và chức năng được lưu trữ trong chính cơ sở dữ liệu. Nếu DAL đơn giản như chỉ thiết lập các tham số và sau đó gọi SP hoặc hàm hoặc SELECT, thì tôi không cần kiểm tra nó.
John Saunders
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.