2011-07-20 49 views
16

Tôi đang làm việc trên một dự án có nhiều mã lệnh plsql và muốn thêm các đơn vị kiểm tra cụ thể hơn vào codebase của chúng tôi. Một số thủ tục/hàm tôi muốn thử nghiệm không có trong thông số gói và tôi không có phương tiện để thay đổi điều đó.Có cách nào để truy cập các thủ tục plsql riêng tư cho mục đích thử nghiệm không?

Có cách nào để truy cập các thủ tục "riêng tư" này mà không cần thêm chúng vào thông số kỹ thuật không?

Ý tưởng duy nhất tôi đã có cho đến nay, là biên dịch một đặc tả gói đặc biệt cho DB trước khi thử nghiệm, xác định các thủ tục được thử nghiệm. Tôi gues rằng sẽ làm việc, nhưng tôi tự hỏi nếu có một cách đơn giản, một số bí mật ác oracle hack có thể ;-)

Tôi đang thử nghiệm từ Java với JUnit/DBUnit.

BR Frank

+0

trùng lặp có thể xảy ra của https://stackoverflow.com/questions/34571/how-do-i-test-a-class-that- có-riêng-phương pháp-lĩnh vực-hoặc-bên trong-lớp học – Raedwald

Trả lời

23

Có cách để thực hiện việc này, cung cấp cho bạn trên 10g trở lên. Nó được gọi là Compilation Compitional. Đây là một tính năng rất gọn gàng cung cấp cú pháp đặc biệt để chúng tôi có thể thay đổi mã PL/SQL của chúng tôi tại thời gian biên dịch.

Vì điều đó xảy ra, tôi đã sử dụng tính năng này một cách chính xác để hiển thị các gói riêng tư trong thông số để tôi có thể chạy các kiểm tra UTPLSQL đối với chúng.

Đây là cú pháp đặc biệt:

create or replace package my_pkg 
as 

    $IF $$dev_env_test $THEN 

    PROCEDURE private_proc; 

    $END 

    FUNCTION public_function return date; 

end my_pkg; 
/

Đó biến với các dấu hiệu đúp đô la là một Compilation cờ có điều kiện.

Nếu tôi mô tả các gói chúng tôi chỉ có thể xem các gói công cộng:

SQL> desc my_pkg 
FUNCTION PUBLIC_FUNCTION RETURNS DATE 

SQL> 

Bây giờ tôi đặt cờ có điều kiện và tái biên dịch gói, và như một phép màu ...

SQL> alter session set plsql_ccflags='dev_env_test:true' 
    2/

Session altered. 

SQL> alter package my_pkg compile 
    2/

Package altered. 

SQL> desc my_pkg 
PROCEDURE PRIVATE_PROC 
FUNCTION PUBLIC_FUNCTION RETURNS DATE 

SQL> 

Tư nhân hoá các chức năng cũng đơn giản như bạn nghĩ rằng nó sẽ là:

SQL> alter session set plsql_ccflags='dev_env_test:false' 
    2/

Session altered. 

SQL> alter package my_pkg compile 
    2/

Package altered. 

SQL> desc my_pkg 
FUNCTION PUBLIC_FUNCTION RETURNS DATE 

SQL> 

Chúng ta có thể làm được nhiều hơn wi lần biên dịch có điều kiện. Nó được đề cập trong tài liệu. Find out more.

+1

+1 câu trả lời xuất sắc và sử dụng trình biên dịch có điều kiện mà tôi sẽ thêm vào hộp công cụ của mình. Cảm ơn! –

+0

+1 Tuyệt vời. Tôi sẽ sử dụng nó theo thời gian! Tôi sẽ cung cấp cho bạn 10 nếu tôi có thể ... – DCookie

+0

+1 Tôi ngạc nhiên, điều đó thực sự tuyệt vời. Nhưng nó cảm thấy một chút như gian lận ;-) –

3

Tôi sẽ ngạc nhiên nếu một điều như vậy tồn tại. Toàn bộ mục đích của các thủ tục riêng tư, các hàm và các biến là chúng không hiển thị đối với các ứng dụng bên ngoài gói.

+0

Chắc chắn, lý do duy nhất tôi hỏi câu hỏi này là bởi vì tôi không muốn phá vỡ đóng gói các gói của tôi. Và sau vài tháng cuối cùng phát triển plsql, nó sẽ không làm tôi ngạc nhiên nếu một điều như vậy tồn tại;) – Frank

+2

Chuẩn bị để được ngạc nhiên: kiểm tra câu trả lời của tôi :) – APC

2

Như @Robert đã nói, không nên truy cập vào bất kỳ thứ gì được khai báo chỉ trong phần thân gói bên ngoài gói đó. Hơn nữa, việc tạo ra một đặc tả "đặc biệt" cho mục đích chạy thử nghiệm đơn vị có thể không hoạt động: nếu cơ thể chứa các khai báo chuyển tiếp (các câu lệnh như trong spec, thường được tìm thấy ở đầu phần thân), thì đặc tả "đặc biệt" sẽ xung đột với những tuyên bố đó và gói sẽ không biên dịch.

+0

Điểm tốt, tôi đã không nghĩ về các thông số kỹ thuật trong cơ thể . – Frank

+0

Âm thanh - nếu không hoàn chỉnh - phân tích lý do tại sao duy trì hai thông số kỹ thuật là một ý tưởng tồi. Nhưng không cung cấp giải pháp khả thi cho yêu cầu hợp pháp là gì. – APC

+0

@APC: Tôi không đồng ý. Tôi đã được tâm trộn lẫn để xem liệu đây có phải là một bình luận hoặc một câu trả lời. – Allan

-1

Bạn có thể sử dụng nhà phát triển pl/sql để kiểm tra thủ tục pl/sql.

1) Tới các gói -> Thủ tục/chức năng
2) Nhấp chuột phải và chọn "test"
3) Nhập các thông số đầu vào và bấm nút thực hiện/chạy và kiểm tra các kết quả.
4) bạn có thể chạy với nhiều bộ dữ liệu và kiểm tra trong các bảng mục tiêu.
5) Chạy với dữ liệu không hợp lệ và kiểm tra các lỗi dự kiến.

bạn có thể biết thêm chi tiết tại http://www.handyinsight.com/2016/06/database-testing.html

temruzinn

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