utPLSQL Test RunnerIntegra o utPLSQL ao VSCode, trazendo os testes de PL/SQL para o Test Explorer nativo, com menu de contexto e cobertura visual.
InstalaçãoA extensão pode ser instalada de duas formas:
Requisitos
A extensão é só o "cliente gráfico" — quem executa os testes é o banco, via CLI. ConexãoA extensão precisa de uma string de conexão Oracle para rodar os testes. A resolução segue esta ordem:
⚠️ Recomendação de segurança: a string de conexão contém senha. NÃO use o
setting
Se nem o setting nem a env var estiverem definidos, a extensão pergunta a conexão e a mantém apenas em memória durante a sessão — use o comando utPLSQL: Limpar conexão da sessão (palette de comandos) para limpá-la. Formatos aceitos:
Como funciona
A extensão monta a linha de comando do CLI, lê os relatórios (JUnit + Cobertura) e os traduz para as APIs nativas do VSCode. Configuração
Exemplo (
E, antes de abrir o VSCode (ou no perfil do PowerShell):
Para contribuidoresCrie um arquivo
Modo de invocação (
|
| Comando | Descrição | Atalho via UI |
|---|---|---|
utPLSQL: Rodar todos os testes |
Executa todas as suites do workspace | Botão ▶ na view Testing |
utPLSQL: Rodar testes do arquivo |
Executa suites do .pks/.pkb ativo |
Clique direito → arquivo |
utPLSQL: Rodar testes do arquivo com cobertura |
Idem, perfil com cobertura | Clique direito → arquivo |
utPLSQL: Rodar testes da pasta |
Executa suites da pasta selecionada | Clique direito → pasta |
utPLSQL: Rodar testes da pasta com cobertura |
Idem, perfil com cobertura | Clique direito → pasta |
utPLSQL: Atualizar testes |
Força rediscovery dos .pks |
— |
utPLSQL: Cancelar execução |
Interrompe o CLI em execução | — |
utPLSQL: Mostrar informações do utPLSQL |
Versões CLI/API/DB com opção de copiar | — |
utPLSQL: Selecionar reporter adicional... |
QuickPick com reporters do banco | — |
utPLSQL: Limpar conexão da sessão |
Remove a conexão do cache da sessão | — |
Cobertura
- Linhas executadas ficam verdes no gutter; não executadas, vermelhas.
- A aba Test Coverage mostra o percentual por arquivo/pasta.
A extensão passa -source_path (= utplsql.sourcePath) e mapeia os objetos cobertos
aos arquivos-fonte via utplsql.coverageSourceArgs (regex + type_mapping). O -owner
é derivado da conexão (ou de utplsql.coverageOwner).
Mapeamento da cobertura aos arquivos (coverageSourceArgs)
O type_mapping traduz o "tipo" capturado pelo regex no tipo Oracle. Três convenções comuns:
1) Por diretório — estrutura sourcePath/<tipo>/<nome>.sql (pastas functions/, procedures/, packages/, …):
"utplsql.coverageSourceArgs": [
"-regex_expression=.*[/\\\\](https://github.com/thepaneb/vscode-utplsql/blob/HEAD/\\w+)[/\\\\](https://github.com/thepaneb/vscode-utplsql/blob/HEAD/\\w+)\\.sql$",
"-type_subexpression=1", // grupo 1 = pasta (tipo)
"-name_subexpression=2", // grupo 2 = arquivo (nome do objeto)
"-type_mapping=packages=PACKAGE BODY/functions=FUNCTION/procedures=PROCEDURE/triggers=TRIGGER"
]
Funciona em qualquer profundidade (o
.*absorve os módulos acima). Nomes de pasta variados (ex.:package,pkg,pacote) podem ser enumerados notype_mapping.
2) Por prefixo do nome — convenção pkg_*, prc_*, vw_* (independe da pasta):
"utplsql.coverageSourceArgs": [
"-regex_expression=.*[/\\\\](https://github.com/thepaneb/vscode-utplsql/blob/HEAD/(pkg|prc|fnc|trg|vw)_\\w+)\\.sql$",
"-name_subexpression=1", // grupo 1 = nome completo (ex.: PKG_EXEMPLO)
"-type_subexpression=2", // grupo 2 = prefixo (tipo)
"-type_mapping=pkg=PACKAGE BODY/prc=PROCEDURE/fnc=FUNCTION/trg=TRIGGER/vw=VIEW"
]
3) Por extensão tipada — arquivos *.pkb, *.fnc, *.prc, *.trg (independe da pasta):
"utplsql.coverageSourceArgs": [
"-regex_expression=.*[/\\\\](https://github.com/thepaneb/vscode-utplsql/blob/HEAD/\\w+)\\.(\\w+)$",
"-name_subexpression=1", // grupo 1 = nome
"-type_subexpression=2", // grupo 2 = extensão (tipo)
"-type_mapping=pkb=PACKAGE BODY/fnc=FUNCTION/prc=PROCEDURE/trg=TRIGGER"
]
Notas importantes:
- Packages →
PACKAGE BODY(nãoPACKAGE): a cobertura é coletada no corpo do package. - Windows / metacaracteres no regex: no modo
launcher(padrão), o.batpassa pelocmd, que consome o^e interpreta o|como pipe — por isso os exemplos acima usam\we[/\\](sem^), e o|do exemplo 2 só funciona dentro da extensão. Solução: useutplsql.invocation = "java"(ver Modo de invocação) — semcmdno meio,^e|passam literais e você fica livre para escrever o regex normalmente. - Windows /
cmd: evite^no regex (ocmddo.bato consome) — por isso os exemplos usam\we[/\\].
Reporters
A extensão sempre inclui três reporters padrão:
ut_documentation_reporter (stdout),
ut_junit_reporter (resultados → Test Explorer) e
ut_coverage_cobertura_reporter (cobertura, se disponível).
Validação dinâmica — antes de rodar com cobertura, a extensão consulta
o banco via utplsql reporters <conn>. Se
UT_COVERAGE_COBERTURA_REPORTER não existir no banco (ex.: utPLSQL
desatualizado), a cobertura é pulada com um aviso no output. A execução
dos testes nunca é bloqueada.
Reporters adicionais fixos — setting utplsql.additionalReporters:
"utplsql.additionalReporters": ["UT_COVERAGE_HTML_REPORTER"]
Os três reporters padrão são deduplicados automaticamente, mesmo se listados aqui.
Reporter volátil por sessão — comando utPLSQL: Selecionar reporter adicional... abre um QuickPick com a lista dinâmica do banco. O reporter escolhido é usado na execução seguinte e descartado após (não persiste nas settings).
Requisitos no banco
Cobertura (sempre) — habilita o profiler:
GRANT EXECUTE ON SYS.DBMS_PROFILER TO <schema_que_roda_os_testes>;
GRANT EXECUTE ON SYS.DBMS_PLSQL_CODE_COVERAGE TO <schema_que_roda_os_testes>;
Sem isso, os testes rodam mas a cobertura sai vazia.
Descoberta de testes em OUTROS schemas (install compartilhado do utPLSQL, ex.: owner UT3):
para o framework enxergar e parsear os testes dos schemas de aplicação, o owner do utPLSQL precisa
ler o dicionário desses schemas:
GRANT SELECT ON SYS.DBA_SOURCE TO <ut3_owner>;
GRANT SELECT ON SYS.DBA_OBJECTS TO <ut3_owner>;
GRANT SELECT ON SYS.DBA_PROCEDURES TO <ut3_owner>;
SELECT ANY DICTIONARYsozinho NÃO basta — precisa dos grants diretos nessas views (por causa dodbms_assert.sql_object_nameem contexto definer).- É preciso também o gatilho de DDL do utPLSQL instalado (mantém o cache de annotations em dia).
- Verificação (como o owner):
SELECT ut_metadata.get_source_view_name FROM dual;deve retornardba_source.
Em install por schema (utPLSQL no mesmo schema dos testes), esses grants cross-schema não são necessários — o framework lê o próprio source.
Limitações conhecidas
- O mapeamento resultado→teste é feito por nome de package + nome/descrição do teste; descrições idênticas em packages diferentes podem gerar ambiguidade (o índice é escopado por package para minimizar isso).
- Considera o primeiro workspace folder para resolver
sourcePath. - A descoberta lê os
.pks(specs); mantenha as annotations%suite/%testno spec.
Troubleshooting
| Sintoma | Causa provável | Solução |
|---|---|---|
| Suites não aparecem | includePatterns não cobre os arquivos |
Ajuste utplsql.includePatterns (ex.: ["**/*.sql"]) |
| Cobertura vazia | Falta GRANT EXECUTE ON DBMS_PROFILER |
Execute os grants em Requisitos no banco |
| Cobertura vazia | Reporter de cobertura não instalado no banco | Atualize o utPLSQL; use utPLSQL: Mostrar informações para verificar versões |
| Timeout ao executar | Testes demoram mais que timeoutMinutes |
Aumente utplsql.timeoutMinutes |
| Erro de conexão | String malformada ou DB inacessível | Use utPLSQL: Mostrar informações para validar a conexão |
| Regex de cobertura não casa | cmd do Windows consome ^ e \| |
Use utplsql.invocation: "java" (veja Modo de invocação) |
%suite não reconhecido |
Falta linha em branco após %suite |
Deixe uma linha em branco entre %suite e o primeiro %test/procedure |
| "relatório não gerado" | CLI não conseguiu gerar XML de saída | Verifique permissões de escrita em %TEMP% e grants do utPLSQL |
Licença
MIT © Gil Cleber Barboza