utPLSQL, czyli testujemy zmiany

Wprowadzając zmiany w kodzie, możemy poczuć się zestresowani. Czy moja zmiana zadziała? Czy nie popsuje innych funkcjonalności? Dlatego po wprowadzeniu poprawek testujemy nasze zmiany. W większości projektów informatycznych testy nowych funkcjonalności są robione automatycznie. Dlaczego więc, w dużej części projektów w PL/SQLu są pomijane? A jeśli już są, jest to na ogół ręczny i żmudny proces. Co, jeśli powiem Ci, że można to zautomatyzować w prosty sposób?
Z pomocą przychodzi biblioteka utPLSQL. Jest to framework do tworzenia testów w języku PL/SQL. Poniżej zaprezentuję, w jaki sposób możemy dodać takie testy do projektu. W jednym z poprzednich artykułów przedstawiłem, w jaki sposób można uruchomić bazę danych w kontenerze Dockera. Rozszerzymy to teraz o utPLSQL.
Pierwszym krokiem, który należy wykonać, jest pobranie najnowszej wersji biblioteki ze strony projektu. Po rozpakowaniu interesuje nas zawartość folderu source
. Należy ją rozpakować do katalogu, w którym przechowujemy plik docker-compose
. Struktura powinna wyglądać w następujący sposób.
├── docker-compose.yml
├── README.md
├── utplsql
│ └── source
│ ├── api
│ ├── check_object_grants.sql
│ ├── check_sys_grants.sql
│ ├── core
│ ├── create_grants.sql
│ ├── create_synonyms_and_grants_for_public.sql
│ ├── create_synonyms.sql
│ ├── create_user_grants.sql
│ ├── create_user_synonyms.sql
│ ├── create_utplsql_owner.sql
│ ├── define_ut3_owner_param.sql
│ ├── dummy.sql
│ ├── expectations
│ ├── install_above_12_1.sql
│ ├── install_component.sql
│ ├── install_ddl_trigger.sql
│ ├── install_headless.sql
│ ├── install_headless_with_trigger.sql
│ ├── install.sql
│ ├── reporters
└── var.env
Po poprawnym uruchomieniu kontenera należy zainstalować pakiet utPLSQL na bazie danych. W tym celu najpierw mapujemy folder utplsql tak, aby był dostępny z poziomu kontenera. Użyjemy do tego opcji volumes
. Kolejnym krokiem będzie instalacja pakietu, przy użyciu instrukcji dostępnych w dokumentacji. Poniżej przedstawiam cały listing.
ls
docker-compose.yml README.md utplsql var.env
# podglad na użytą konfigurację
nano docker-compose.yml
version: "3.3"
services:
oraclelocal:
container_name: oraclelocal
image: container-registry.oracle.com/database/standard
ports:
- "1527:1521"
- "5507:5500"
volumes:
- ./utplsql/source:/opt/oracle/utplsql:rw
shm_size: 8g
# sprawdzenie, czy wszystko odpowiednio zmapowało się w kontenerze
docker exec -it oraclelocal /bin/bash
[root@020271ee9447 /]# ls /opt/oracle/utplsql/
api create_utplsql_owner.sql install_headless_with_trigger.sql
check_object_grants.sql define_ut3_owner_param.sql reporters
check_sys_grants.sql dummy.sql set_install_params.sql
core expectations uninstall.sql
create_grants.sql install.sql uninstall_all.sql
create_synonyms.sql install_above_12_1.sql uninstall_coverage_tables.sql
create_synonyms_and_grants_for_public.sql install_component.sql uninstall_objects.sql
create_user_grants.sql install_ddl_trigger.sql uninstall_synonyms.sql
create_user_synonyms.sql install_headless.sql
# instalacja frameworka
[root@020271ee9447 utplsql]# /u01/app/oracle/product/12.1.0/dbhome_1/bin/sqlplus sys/Oracle@PDB1 as sysdba @install_headless_with_trigger.sql
Po wykonaniu powyższych komend powinniśmy mieć zainstalowany framework utPLSQL na bazie danych. Żeby to zweryfikować, możemy uruchomić testy. Oczywiście, nie stworzyliśmy aktualnie żadnego testu, jednak możemy sprawdzić działanie i potwierdzić poprawność instalacji.
[root@70e5c878b2f6 utplsql]# /u01/app/oracle/product/12.1.0/dbhome_1/bin/sqlplus ut3/XNtxj8eEgA6X6b6f@PDB1
SQL*Plus: Release 12.1.0.2.0 Production on Sat Aug 6 15:09:20 2022
Copyright (c) 1982, 2014, Oracle. All rights reserved.
Connected to:
Oracle Database 12c Standard Edition Release 12.1.0.2.0 - 64bit Production
SQL> begin ut.run(); end;
2 /
PL/SQL procedure successfully completed.
Jak widać na powyższym przykładzie, wszystko zostało zainstalowane poprawnie. Możemy skupić się na utworzeniu przykładowych testów dla istniejących już funkcjonalności. Przedstawiony do tej pory zestaw narzędzi umożliwia nam powtarzalne instalowanie naszego kodu na lokalnej bazie danych oraz jego testowanie. Jeśli potrzebujemy posiadać pełny backup możemy go również wczytać za pomocą narzędzia IMPDP. Dzięki takiej konfiguracji zapewniamy możliwość szybszej i wygodniejszej pracy pojedynczemu programiście. Kolejnym krokiem będzie spięcie całego procesu poprzez użycie jednego z rozwiązań do Continuous Integration.
Cały kod możecie dostępny jest w moim repozytorium na Githubie. Jest tam również pełna konfiguracja, dzięki czemu bezpośrednio po ściągnięciu można przetestować rozwiązanie.
Najnowsze komentarze