36

Làm cách nào để bạn kiểm tra T-SQL của mình? Bạn sử dụng thư viện/công cụ nào?Làm cách nào để bạn kiểm tra đơn vị T-SQL

Phần trăm mã của bạn được bao gồm trong các bài kiểm tra đơn vị và cách bạn đo lường? Làm thế nào để bạn quyết định các mô-đun để đơn vị kiểm tra đầu tiên?

Bạn có nghĩ rằng thời gian và công sức mà bạn đầu tư vào việc khai thác thử nghiệm đơn vị của bạn đã được đền đáp hay không?

Nếu bạn không sử dụng thử nghiệm đơn vị, bạn có thể giải thích tại sao không?

Trả lời

19

Làm thế nào để đơn vị kiểm tra T-SQL của bạn? Bạn sử dụng thư viện/công cụ nào?

Hãy xem TSQLUnit và điều này tSQLt.

Tôi đã thử nghiệm bằng cách sử dụng một vài khung công tác khác nhau trong nhiều ngôn ngữ để kiểm tra T-SQL, chẳng hạn như junit hoặc nunit. Lý do tôi đi tuyến đường này là tận dụng môi trường thử nghiệm phong phú bằng các ngôn ngữ khác này. Nếu ví dụ bạn sử dụng nunit nó có một dòng lệnh tốt đẹp và gui viewer để xem xét trạng thái của các test của bạn và bởi vì bạn sử dụng .net để viết test của bạn nó móc vào máy chủ sql rất dễ dàng. JUnit có một số tích hợp tốt đẹp với rất nhiều môi trường IDE nguồn mở và thương mại như NetBeans và IDEA cũng như làm cho việc kiểm tra T-SQL giống như kiểm thử mã Java, rất giàu. Các tiêu cực là bạn không chỉ viết T-SQL bạn cũng đang viết java hoặc .net để kiểm tra T-SQL của bạn.

Tôi cũng đã sử dụng Ruby với Rake (nó giống như make hoặc ant) ​​và thực hiện các cuộc gọi hệ thống tới sqlcmd để thực thi các tập lệnh sql có chứa các kiểm tra. Các kịch bản trả về các giá trị và chuỗi trở lại ruby ​​để vượt qua hoặc thất bại một thử nghiệm. Tôi thích cách tiếp cận này là tốt nhất vì nó rất gọn gàng và dễ dàng cho người khác để tiếp tục. Các tuyến khác được đề cập ở trên yêu cầu các nhà phát triển sử dụng .net hoặc java nếu bạn có tất cả các loại DBA có thể khó khắc phục nơi Ruby có cách tiếp cận kịch bản sql dễ bán hơn từ kinh nghiệm của tôi. Các kiểu DBA có xu hướng mở và có khả năng nhận các kịch bản như các ngôn ngữ dễ dàng và Ruby có một đường cong học tập thấp và các kịch bản rất dễ chạy liên quan đến một lớp .net hoặc java.

Phần trăm mã của bạn được bao gồm trong các bài kiểm tra đơn vị và cách bạn đo lường?

Có lẽ chỉ có 20% chỉ vì hầu hết các hệ thống cơ sở dữ liệu trước đây không có thử nghiệm được tạo cho chúng khi chúng được tạo nên tôi đang tích cực thử nghiệm thêm và thêm thử nghiệm khi lỗi mới và cải tiến xuất hiện.

Bạn có nghĩ rằng thời gian và công sức mà bạn đầu tư vào việc khai thác thử nghiệm đơn vị của bạn đã được đền đáp hay không?

Cơ sở dữ liệu là bánh mì và bơ của hầu hết các doanh nghiệp. Nó luôn luôn trả hết trong quan điểm của tôi. Nếu doanh nghiệp của bạn chấp nhận tỷ lệ thất bại và tỷ lệ thất bại cao đối với khách hàng thì không có thử nghiệm nào có thể không đáng giá vì nó không miễn phí.

Nếu bạn không sử dụng thử nghiệm đơn vị, bạn có thể giải thích tại sao không?

Tôi rất thích xem có ai đưa ra câu trả lời cho điều này không vô lý hay không. Kinda như thế nào tại sao bạn không đặt con của bạn trong một chỗ ngồi xe khi lái xe xuống đường ... "Họ chi phí quá nhiều" ... "Mất quá nhiều thời gian để đưa đứa trẻ vào nó" .. "Anh ấy an toàn mà không có nó ".." Những gì có thể đi sai để biện minh cho nó ".." Chỉ có không đủ thời gian "Tất cả những điều này là bs.

Vâng tôi biết một chút cực đoan có thể, nhưng thực sự nếu bạn có một hệ thống và nó mang lại giá trị công ty cần được thống nhất thử nghiệm để nắm bắt một số vấn đề trước khi chúng trở thành vấn đề sản xuất. Thử nghiệm đơn vị không phải là thuốc chữa bách bệnh, nhưng đó là một công cụ chúng tôi phải làm tốt nhất có thể.

Tôi sẽ nói tổng thể bằng cách nào đó hầu hết mọi người cung cấp cho cơ sở dữ liệu một pass miễn phí khi nói đến thử nghiệm có cấu trúc. Tôi không biết tại sao lại như vậy, nhưng tôi đã thấy nó ở công ty sau công ty. Tôi rất thích nhìn thấy sự thay đổi đó.

+0

StarShip3000, Bạn đang sử dụng TSQLUnit? Bạn có so sánh toàn bộ tập hợp kết quả với các giá trị dự kiến ​​không, hoặc bạn có khớp các giá trị riêng lẻ một cách riêng biệt không? –

+1

Hiện tại tôi không sử dụng TSQLUnit tôi đã từng làm trong quá khứ. Bây giờ tôi sử dụng một khung kiểm thử đơn vị từ Ruby và Ruby thực thi kịch bản lệnh sql của tôi, trong đó có 1 kiểm tra thông qua một cuộc gọi đến sqlcmd. Cuộc gọi này sau đó trả về giá trị lỗi vượt qua và mô tả chuỗi thành ruby. Tôi sẽ đào lên ví dụ đơn giản khi tôi có thời gian. – Kuberchaun

5

Đối với công cụ kiểm tra đơn vị, tôi đã thành công nhất với DBFit.

Tôi chưa bao giờ tìm thấy công cụ để đo lường phạm vi kiểm tra TSQL.

Sau khi chấp nhận rằng có mức độ đau đớn liên quan đến việc thiết lập thử nghiệm, tôi thấy rằng tôi có thể cải thiện chất lượng mã của mình bằng thử nghiệm đơn vị, khi dự án đạt đến mức độ phức tạp hơn mức độ phức tạp.

+0

Ed, tôi nghĩ DbFit khá dễ vỡ, khó duy trì. Nếu bạn thay đổi một cái gì đó, bạn phải dành nhiều thời gian điều chỉnh các bài kiểm tra của bạn. Bạn nghĩ sao? –

+0

@AlexKuznetsov - Ở một mức độ nào đó, đó là bản chất của thử nghiệm đơn vị DB - đó là vấn đề với tất cả các công cụ tôi đã thử. Tôi thấy rằng DBFit đi xa nhất để giảm bớt vấn đề, một khi bạn tính đến khả năng bao gồm các bài kiểm tra/trang khác bên trong một bài kiểm tra. Với một chút kế hoạch, các xét nghiệm có thể được cấu trúc để giảm thiểu sự đau đớn của việc tái cấu trúc. Các tích cực khác tôi đã tìm thấy là các bài kiểm tra là dễ hiểu cho người dùng ít kỹ thuật trong một cách mà, nói, TSQLUnit/NUnit thử nghiệm không. –

+0

Ed, bạn sẽ làm gì khi kết quả mong đợi của bạn đã thay đổi? Bạn có sửa chữa các bài kiểm tra của mình theo cách thủ công hay bạn tạo ra kết quả mong đợi mới? –

2

Giống như mã thông thường, một số thứ trong T-SQL phải được kiểm tra khác với những thứ khác. Nếu bạn tạo mã nhiều thứ tĩnh (như trình kích hoạt hoặc chế độ xem), thường tải thử nghiệm sẽ nhẹ hơn.

Hệ thống cụ thể của chúng tôi gần như hoàn toàn được mã hóa trong T-SQL.

Làm thế nào để đơn vị kiểm tra T-SQL của bạn? Bạn sử dụng thư viện/công cụ nào?

Chúng tôi đã biết kết quả tốt mà chúng tôi so sánh. Trong phân tích hàng tháng của chúng tôi, chúng tôi so sánh tháng trong tháng và chạy trên để hiểu tác động của thay đổi mã và dữ liệu. Công cụ chính của chúng tôi là một proc được lưu trữ sẽ so sánh hai bảng/lượt xem/tập hợp con và xác định sự khác biệt (với các tùy chọn ngưỡng).

Phần trăm mã của bạn được bao gồm trong các bài kiểm tra đơn vị và cách bạn đo lường?

Chúng tôi xác thực dữ liệu được tạo ra trong hầu hết các quy trình chống lại hành vi lịch sử. Khi thực hiện thay đổi mã do yêu cầu nghiệp vụ, phân tích tác động được thực hiện so sánh kết quả đầu ra từ cả hai lần chạy. Chúng tôi cũng dựa nhiều vào báo cáo ngoại lệ để xác định trước khi dữ liệu không phù hợp với kỳ vọng/cấu hình (các ràng buộc trong lược đồ nếu có thể).

Bạn có nghĩ rằng thời gian và công sức mà bạn đầu tư vào việc khai thác thử nghiệm đơn vị của bạn đã được đền đáp hay không?

Nếu bạn không sử dụng kiểm tra đơn vị, có thể giúp bạn giải thích tại sao không?

Thử nghiệm đơn vị của chúng tôi là ở mỗi cấp "quy trình" của chúng tôi. Mỗi quy trình thường tương ứng với một quy trình được lưu trữ duy nhất - vì vậy đó là đơn vị chúng tôi kiểm tra. So sánh các kết quả đầu ra cuối cùng sẽ tương ứng với kiểm tra hệ thống.

+0

Cade Roux, Bạn có thể giải thích tại sao bạn chọn T-SQL để mã hóa các thử nghiệm của mình? –

+0

@AlexKuznetsov Bởi vì hệ thống của chúng tôi hoàn toàn trong T-SQL (ngoài bảng điều khiển), nên có tất cả các thử nghiệm trong T-SQL. –

+0

@AlexKuznetsov Hệ thống của chúng tôi cũng là hệ thống phân tích/xử lý dữ liệu hàng loạt hàng tháng, vì vậy chúng tôi có một lượng lớn dữ liệu và kết quả đầu ra dự kiến. Sau mỗi lần sản xuất của mỗi tháng, chúng tôi có thể tái cấu trúc và chạy nhiều chu kỳ, đảm bảo rằng đầu ra chỉ thay đổi như mong đợi. –

1

Gần đây chúng tôi đã chuyển từ Đơn vị T-SQL sang khung kiểm tra Đơn vị Visual Studio 2010. Khiếu nại lớn nhất là chúng ta cần quản lý phạm vi giao dịch của riêng mình trong các thử nghiệm để cơ sở dữ liệu "sạch" cho (các) thử nghiệm tiếp theo. Đây là thứ mà đơn vị T-SQL cung cấp ngay khi bắt đầu.

Mục tiêu của chúng tôi là có phạm vi bao phủ 100% cho các thủ tục được lưu trữ của chúng tôi.Nó cho phép chúng ta thay đổi cấu trúc bảng cơ bản và các mối quan hệ khi cần mà không cần phải hoàn toàn trong bước khóa với sự phát triển (chúng ta có các nhóm phát triển và dữ liệu độc lập). Chúng tôi chưa bắt đầu đo lường phạm vi kiểm tra. Chúng tôi đang trong quá trình phát triển triển khai sản xuất đầu tiên với ngăn xếp công nghệ này. Đối với chúng tôi giao diện giữa các ứng dụng và dữ liệu được lưu trữ thủ tục. Đầu tiên chúng ta xây dựng các thủ tục lưu trữ đủ để đáp ứng nhu cầu của nhóm ứng dụng và sau đó khi chữ ký đã trở nên ổn định, đủ để tích hợp liên tục, thì chúng ta sẽ xây dựng các bài kiểm tra đơn vị của mình. Chúng tôi muốn làm TDD, nhưng chúng tôi có một thời hạn mà làm cho rằng chỉ cần không phải là một lựa chọn thực tế.

Chúng tôi chưa đo lường ROI trên thử nghiệm khai thác, nhưng kinh nghiệm cho chúng ta thấy rằng những thay đổi đối với cơ sở dữ liệu sản xuất rất tốn kém.

+0

Đã được phỏng đoán, bạn có cân nhắc thiết lập một và cùng một dữ liệu cho tất cả các thử nghiệm của mình, để bạn không cần giao dịch không? –

+0

@AlexKuznetsov Chúng tôi đã có rất nhiều cuộc tranh luận xung quanh ý nghĩa của "kiểm tra đơn vị". Một phần của định nghĩa mà chúng tôi quyết định thử và bảo tồn là các bài kiểm tra đơn vị không nên ảnh hưởng đến trạng thái tổng thể của hệ thống.Thật không may cơ sở dữ liệu vốn đã được nhà nước để đặt ra một số thách thức. Có thể mô hình của chúng tôi sẽ thay đổi theo thời gian để cảm thấy tốt hơn khi thử nghiệm giới thiệu bất kỳ dữ liệu cần thiết nào làm điều kiện tiên quyết trước khi thực hiện kiểm tra và cuộn tất cả lại để chúng tôi không làm mất hiệu lực một thử nghiệm khác. Họ (kiểm tra đơn vị) sẽ có thể chạy độc lập với nhau. – Suirtimed

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