Integra o utPLSQL ao VSCode, trazendo os testes de PL/SQL para o Test Explorer nativo, com menu de contexto e cobertura visual.
- 🧪 Test Explorer nativo — suites e testes aparecem na view de testes; rode por teste, suite, arquivo ou pasta.
- 🖱️ Menu de contexto — clique direito em uma pasta ou em um arquivo
.pks/.pkb(no Explorer ou no editor) para rodar os testes. - ✅ Resultados na view de testes — verde/vermelho por teste, com a mensagem de falha do utPLSQL.
- 📊 Cobertura visual — gutters coloridos por linha (coberta/não coberta) e percentual por arquivo na aba Coverage, usando a Test Coverage API do VSCode.
A extensão pode ser instalada de duas formas:
- Pelo Marketplace: Procure por utPLSQL Test Runner no painel de extensões do VSCode (
Ctrl+Shift+X) e clique em Instalar. - Manualmente (.vsix): Baixe o arquivo
.vsixda versão desejada e instale no VSCode:- Via Linha de Comando:
code --install-extension vscode-utplsql-<versao>.vsix - Via Interface: Abra o painel de Extensões (
Ctrl+Shift+X), clique nos três pontos...(canto superior direito) e selecione Install from VSIX....
- Via Linha de Comando:
- Framework utPLSQL (UT3) instalado no banco Oracle.
- utPLSQL-cli + Java instalados na máquina (a extensão chama o CLI).
- VSCode 1.88+ (Test Coverage API).
A extensão é só o "cliente gráfico" — quem executa os testes é o banco, via CLI.
A extensão precisa de uma string de conexão Oracle para rodar os testes. A resolução segue esta ordem:
- Setting
utplsql.connection— lido dosettings.jsondo projeto/usuário. - Variável de ambiente
UTPLSQL_CONN— definida antes de abrir o VSCode. - Cache da sessão — se o usuário já digitou a conexão via prompt.
- Prompt ao usuário — pergunta e mantém só na sessão atual.
utplsql.connection em ambientes compartilhados (o settings.json pode
ser versionado ou visível a outros). Em vez disso, use a variável de ambiente
UTPLSQL_CONN:
# PowerShell
$env:UTPLSQL_CONN = "usuario/senha@//host:1521/servico"
code .# Bash
export UTPLSQL_CONN="usuario/senha@//host:1521/servico"
code .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.
Test Explorer / menu de contexto
│ (descobre %suite / %test nos .pks)
▼
utplsql run <conn> -p=<suites>
-f=ut_junit_reporter -o=results.xml ──► resultados na view de testes
-f=ut_coverage_cobertura_reporter -o=coverage.xml ──► gutters + % na aba Coverage
-f=ut_documentation_reporter -c ──► log no terminal de testes
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.
| Setting | Default | Descrição |
|---|---|---|
utplsql.connection |
"" |
Conexão Oracle. Deixe vazio e use a variável de ambiente UTPLSQL_CONN para não gravar a senha. Se ambos vazios, a extensão pergunta (guarda só na sessão). |
utplsql.cliPath |
utplsql |
Caminho do executável do utPLSQL-cli (ex.: C:\tools\utPLSQL-cli\bin\utplsql.bat). |
utplsql.sourcePath |
install |
Pasta do código de produção (para mapear a cobertura aos arquivos). |
utplsql.includePatterns |
["**/*.pks"] |
Globs para descobrir os specs com %suite/%test. Se seus testes estão em .sql, use ["**/*.sql"]. |
utplsql.extraRunArgs |
[] |
Argumentos extras para o utplsql run. |
utplsql.coverageOwner |
"" |
Schema dono dos objetos cobertos. Vazio = usa o usuário da conexão (em maiúsculas). |
utplsql.coverageSourceArgs |
(ver Cobertura) | Args do CLI que mapeiam a c |
utplsql.javaPath |
java |
Executável do Java (PATH ou caminho completo). Usado só no modo java. |
utplsql.cliHome |
"" |
Raiz do utPLSQL-cli (pasta com bin/ e lib/). Vazio = derivado do cliPath. Usado só no modo java. |
utplsql.timeoutMinutes |
60 |
Timeout em minutos para o CLI (flag -t). |
utplsql.dbmsOutput |
false |
Habilita DBMS_OUTPUT na sessão de teste (flag -D). |
utplsql.quiet |
false |
Suprime logs informativos do CLI (flag -q). |
utplsql.failureExitCode |
1 |
Código de saída em caso de falha (flag --failure-exit-code). 0 faz o CLI sempre exitir com sucesso. |
Exemplo (.vscode/settings.json do projeto):
E, antes de abrir o VSCode (ou no perfil do PowerShell):
$env:UTPLSQL_CONN = "DEV/senha@//localhost:1521/XEPDB1"Por padrão (utplsql.invocation = "launcher") a extensão chama o launcher
utplsql/utplsql.bat. No Windows isso passa pelo cmd, que consome/interpreta
metacaracteres (^ vira escape, | vira pipe) — o que atrapalha regex em
coverageSourceArgs.
O modo java chama a JVM direto (java -cp <home>/etc;<home>/lib/* … org.utplsql.cli.Cli), sem shell. Os argumentos vão para o processo como um array,
sem cmd no meio, então ^ e | passam literais — você pode usar ^âncoras$ e
(a|b|c) no regex sem contornos.
{
"utplsql.invocation": "java",
"utplsql.cliPath": "C:\\tools\\utPLSQL-cli\\bin\\utplsql.bat", // cliHome é derivado daqui
// "utplsql.cliHome": "C:\\tools\\utPLSQL-cli", // só se cliPath for um comando do PATH
// "utplsql.javaPath": "java" // PATH, ou caminho completo do java.exe
}O modo
javareplica fielmente o que o.batfaz (mesmo classpath e mesmas propriedades-D); a única diferença é não passar pelocmd. Requer ojavano PATH (ou emutplsql.javaPath) e que a raiz do CLI seja resolvível — ou viacliPathapontando para…/bin/utplsql(.bat), ou definindocliHome.
- Abra o projeto PL/SQL (com o código e os packages de teste).
- Compile o código e os testes no banco (extensão Oracle / SQLcl).
- Abra a view Testing → as suites aparecem.
- Rode:
- Pelo gutter ao lado de cada teste/suite, ou
- Botão Run Tests da view, ou
- Clique direito numa pasta/arquivo → utPLSQL: Rodar testes… (com ou sem cobertura).
- Para cobertura, use o perfil Run with Coverage (ou o item de menu "com cobertura").
- Para diagnóstico, use o comando utPLSQL: Mostrar informações do utPLSQL na palette (
Ctrl+Shift+P) — exibe as versões do CLI, da API Java e do utPLSQL no banco, com opção de copiar.
- 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).
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=.*[/\\\\](\\w+)[/\\\\](\\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=.*[/\\\\]((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=.*[/\\\\](\\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[/\\].
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.
💡 Ao escrever testes: deixe uma linha em branco separando o
%suitedos%test/procedures, senão o%suite"gruda" na procedure e o package não é reconhecido como suíte.
- 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.
MIT © Gil Cleber Barboza


{ "utplsql.cliPath": "C:\\tools\\utPLSQL-cli\\bin\\utplsql.bat", "utplsql.sourcePath": "install", // utplsql.connection fica vazio -> use a variável de ambiente UTPLSQL_CONN }