diff --git a/Makefile b/Makefile index 195a38110..9975095fc 100755 --- a/Makefile +++ b/Makefile @@ -1,11 +1,22 @@ .PHONY: .env help clean dist all install destroy up update down test test-functional test-functional-parallel test-unit bash_org1 bash_org2 verify-config - # Parâmetros de execução do comando MAKE -# Opções possíveis para testes: sei3, sei4, super -versao_sei=super +# Opções possíveis para spe (sistema de proc eletronico): sei3, sei4, super +sistema=super teste= +ifeq (, $(shell groups |grep docker)) + CMD_DOCKER_SUDO=sudo +else + CMD_DOCKER_SUDO= +endif + +ifeq (, $(shell which docker-compose)) + CMD_DOCKER_COMPOSE=$(CMD_DOCKER_SUDO) docker compose +else + CMD_DOCKER_COMPOSE=$(CMD_DOCKER_SUDO) docker-compose +endif + MODULO_NOME = pen MODULO_PASTAS_CONFIG = mod-$(MODULO_NOME) VERSAO_MODULO := $(shell grep 'define."VERSAO_MODULO_PEN"' src/PENIntegracao.php | cut -d'"' -f4) @@ -15,8 +26,8 @@ SEI_BIN_DIR = dist/sei/bin/mod-pen SEI_MODULO_DIR = dist/sei/web/modulos/pen SIP_SCRIPTS_DIR = dist/sip/scripts/mod-pen PEN_MODULO_COMPACTADO = mod-sei-pen-$(VERSAO_MODULO).zip -PEN_TEST_FUNC = tests_$(versao_sei)/funcional -PEN_TEST_UNIT = tests_$(versao_sei)/unitario +PEN_TEST_FUNC = tests_$(sistema)/funcional +PEN_TEST_UNIT = tests_$(sistema)/unitario PARALLEL_TEST_NODES = 5 -include $(PEN_TEST_FUNC)/.env @@ -28,21 +39,53 @@ CMD_INSTALACAO_SEI_MODULO = echo -ne '$(SEI_DATABASE_USER)\n$(SEI_DATABASE_PASSW CMD_INSTALACAO_SIP_MODULO = echo -ne '$(SIP_DATABASE_USER)\n$(SIP_DATABASE_PASSWORD)\n' | php sip_atualizar_versao_modulo_pen.php -ifeq (, $(shell groups |grep docker)) - CMD_DOCKER_SUDO=sudo -else - CMD_DOCKER_SUDO= -endif - -ifeq (, $(shell which docker-compose)) - CMD_DOCKER_COMPOSE=$(CMD_DOCKER_SUDO) docker compose -else - CMD_DOCKER_COMPOSE=$(CMD_DOCKER_SUDO) docker-compose -endif +CMD_COMPOSE_UNIT = $(CMD_DOCKER_COMPOSE) -f $(PEN_TEST_UNIT)/docker-compose.yml --env-file $(PEN_TEST_UNIT)/.env +CMD_COMPOSE_FUNC = $(CMD_DOCKER_COMPOSE) -f $(PEN_TEST_FUNC)/docker-compose.yml --env-file $(PEN_TEST_FUNC)/.env +CMD_COMPOSE_FUNC_EXEC = $(CMD_COMPOSE_FUNC) exec -T +CMD_CURL_LOGIN_ORG1 = $(CMD_COMPOSE_FUNC_EXEC) org1-http bash -c 'curl -s -L $${HOST_URL:-$$SEI_HOST_URL}/sei | grep -q ""' +CMD_CURL_LOGIN_ORG2 = $(CMD_COMPOSE_FUNC_EXEC) org2-http bash -c 'curl -s -L $${HOST_URL:-$$SEI_HOST_URL}/sei | grep -q ""' +FILE_VENDOR_FUNCIONAL = $(PEN_TEST_FUNC)/vendor/bin/phpunit +FILE_VENDOR_UNITARIO = $(PEN_TEST_UNIT)/vendor/bin/phpunit all: help +check-isalive: ## Target de apoio. Acessa os Sistemas e verifica se estao respondendo a tela de login + @echo "" + @echo "Testando se a pagina de login responde para o org1..." + @for i in `seq 1 15`; do \ + echo "Tentativa $$i/15"; \ + if $(CMD_CURL_LOGIN_ORG1); then \ + echo 'Página de login encontrada!' ; \ + break ; \ + fi; \ + sleep 5; \ + done; \ + if ! $(CMD_CURL_LOGIN_ORG1); then echo 'Pagina de login do org1 nao encontrada. Verifique...'; exit 1 ; fi; + @echo "Testando se a pagina de login responde para o org2..." + @for i in `seq 1 15`; do \ + echo "Tentativa $$i/15"; \ + if $(CMD_CURL_LOGIN_ORG2); then \ + echo 'Página de login encontrada!' ; \ + break ; \ + fi; \ + sleep 5; \ + done; \ + if ! $(CMD_CURL_LOGIN_ORG2); then echo 'Pagina de login do org2 nao encontrada. Verifique...'; exit 1 ; fi; + + +install-phpunit-vendor: ## instala os pacotes composer referentes aos testes via phpunit + $(CMD_DOCKER_COMPOSE) -f $(PEN_TEST_FUNC)/docker-compose.yml run --rm -w /tests php-test-functional bash -c './composer.phar install' + $(CMD_DOCKER_COMPOSE) -f $(PEN_TEST_FUNC)/docker-compose.yml run --rm -w /tests php-test-unit bash -c './composer.phar install' + + +$(FILE_VENDOR_FUNCIONAL): ## target de apoio verifica se o build do phpunit foi feito e executa apenas caso n exista + make install-phpunit-vendor + + +$(FILE_VENDOR_UNITARIO): ## target de apoio verifica se o build do phpunit foi feito e executa apenas caso n exista + make install-phpunit-vendor + dist: # ATENÇÃO: AO ADICIONAR UM NOVO ARQUIVO DE DEPLOY, VERIFICAR O MESMO EM VerificadorInstalacaoRN::verificarPosicionamentoScriptsConectado @mkdir -p $(SEI_SCRIPTS_DIR) @@ -82,81 +125,78 @@ clean: @echo "Limpeza do diretório de distribuição do realizada com sucesso" -install: - $(CMD_DOCKER_COMPOSE) -f $(PEN_TEST_FUNC)/docker-compose.yml --env-file $(PEN_TEST_FUNC)/.env up -d - @echo "Sleeping for 20 seconds ..."; sleep 2; - $(CMD_DOCKER_COMPOSE) -f $(PEN_TEST_FUNC)/docker-compose.yml --env-file $(PEN_TEST_FUNC)/.env exec org1-http bash -c "printenv | sed 's/^\(.*\)$$/export \1/g' > /root/crond_env.sh" - $(CMD_DOCKER_COMPOSE) -f $(PEN_TEST_FUNC)/docker-compose.yml --env-file $(PEN_TEST_FUNC)/.env exec org1-http chown -R root:root /etc/cron.d/ - $(CMD_DOCKER_COMPOSE) -f $(PEN_TEST_FUNC)/docker-compose.yml --env-file $(PEN_TEST_FUNC)/.env exec org1-http chmod 0644 /etc/cron.d/sei - $(CMD_DOCKER_COMPOSE) -f $(PEN_TEST_FUNC)/docker-compose.yml --env-file $(PEN_TEST_FUNC)/.env exec org1-http chmod 0644 /etc/cron.d/sip - $(CMD_DOCKER_COMPOSE) -f $(PEN_TEST_FUNC)/docker-compose.yml --env-file $(PEN_TEST_FUNC)/.env exec -w /opt/sei/scripts/$(MODULO_PASTAS_CONFIG) org1-http bash -c "$(CMD_INSTALACAO_SEI_MODULO)" - $(CMD_DOCKER_COMPOSE) -f $(PEN_TEST_FUNC)/docker-compose.yml --env-file $(PEN_TEST_FUNC)/.env exec -w /opt/sip/scripts/$(MODULO_PASTAS_CONFIG) org1-http bash -c "$(CMD_INSTALACAO_SIP_MODULO)" +install: check-isalive + $(CMD_COMPOSE_FUNC) up -d + $(CMD_COMPOSE_FUNC) exec org1-http bash -c "printenv | sed 's/^\(.*\)$$/export \1/g' > /root/crond_env.sh" + $(CMD_COMPOSE_FUNC) exec org1-http chown -R root:root /etc/cron.d/ + $(CMD_COMPOSE_FUNC) exec org1-http chmod 0644 /etc/cron.d/sei + $(CMD_COMPOSE_FUNC) exec org1-http chmod 0644 /etc/cron.d/sip + $(CMD_COMPOSE_FUNC) exec -w /opt/sei/scripts/$(MODULO_PASTAS_CONFIG) org1-http bash -c "$(CMD_INSTALACAO_SEI_MODULO)" + $(CMD_COMPOSE_FUNC) exec -w /opt/sip/scripts/$(MODULO_PASTAS_CONFIG) org1-http bash -c "$(CMD_INSTALACAO_SIP_MODULO)" - $(CMD_DOCKER_COMPOSE) -f $(PEN_TEST_FUNC)/docker-compose.yml --env-file $(PEN_TEST_FUNC)/.env exec org2-http bash -c "printenv | sed 's/^\(.*\)$$/export \1/g' > /root/crond_env.sh" - $(CMD_DOCKER_COMPOSE) -f $(PEN_TEST_FUNC)/docker-compose.yml --env-file $(PEN_TEST_FUNC)/.env exec org2-http chown -R root:root /etc/cron.d/ - $(CMD_DOCKER_COMPOSE) -f $(PEN_TEST_FUNC)/docker-compose.yml --env-file $(PEN_TEST_FUNC)/.env exec org2-http chmod 0644 /etc/cron.d/sei - $(CMD_DOCKER_COMPOSE) -f $(PEN_TEST_FUNC)/docker-compose.yml --env-file $(PEN_TEST_FUNC)/.env exec org2-http chmod 0644 /etc/cron.d/sip - $(CMD_DOCKER_COMPOSE) -f $(PEN_TEST_FUNC)/docker-compose.yml --env-file $(PEN_TEST_FUNC)/.env exec -w /opt/sei/scripts/$(MODULO_PASTAS_CONFIG) org2-http bash -c "$(CMD_INSTALACAO_SEI_MODULO)" - $(CMD_DOCKER_COMPOSE) -f $(PEN_TEST_FUNC)/docker-compose.yml --env-file $(PEN_TEST_FUNC)/.env exec -w /opt/sip/scripts/$(MODULO_PASTAS_CONFIG) org2-http bash -c "$(CMD_INSTALACAO_SIP_MODULO)" + $(CMD_COMPOSE_FUNC) exec org2-http bash -c "printenv | sed 's/^\(.*\)$$/export \1/g' > /root/crond_env.sh" + $(CMD_COMPOSE_FUNC) exec org2-http chown -R root:root /etc/cron.d/ + $(CMD_COMPOSE_FUNC) exec org2-http chmod 0644 /etc/cron.d/sei + $(CMD_COMPOSE_FUNC) exec org2-http chmod 0644 /etc/cron.d/sip + $(CMD_COMPOSE_FUNC) exec -w /opt/sei/scripts/$(MODULO_PASTAS_CONFIG) org2-http bash -c "$(CMD_INSTALACAO_SEI_MODULO)" + $(CMD_COMPOSE_FUNC) exec -w /opt/sip/scripts/$(MODULO_PASTAS_CONFIG) org2-http bash -c "$(CMD_INSTALACAO_SIP_MODULO)" wget -nc -i $(PEN_TEST_FUNC)/assets/arquivos/test_files_index.txt -P $(PEN_TEST_FUNC)/.tmp cp $(PEN_TEST_FUNC)/.tmp/* /tmp up: - $(CMD_DOCKER_COMPOSE) -f $(PEN_TEST_FUNC)/docker-compose.yml --env-file $(PEN_TEST_FUNC)/.env up -d + $(CMD_COMPOSE_FUNC) up -d update: ## Atualiza banco de dados através dos scripts de atualização do sistema - $(CMD_DOCKER_COMPOSE) -f $(PEN_TEST_FUNC)/docker-compose.yml --env-file $(PEN_TEST_FUNC)/.env run --rm -w /opt/sei/scripts/ org1-http bash -c "$(CMD_INSTALACAO_SEI)"; true - $(CMD_DOCKER_COMPOSE) -f $(PEN_TEST_FUNC)/docker-compose.yml --env-file $(PEN_TEST_FUNC)/.env run --rm -w /opt/sip/scripts/ org1-http bash -c "$(CMD_INSTALACAO_SIP)"; true - $(CMD_DOCKER_COMPOSE) -f $(PEN_TEST_FUNC)/docker-compose.yml --env-file $(PEN_TEST_FUNC)/.env run --rm -w /opt/sip/scripts/ org1-http bash -c "$(CMD_INSTALACAO_RECURSOS_SEI)"; true - $(CMD_DOCKER_COMPOSE) -f $(PEN_TEST_FUNC)/docker-compose.yml --env-file $(PEN_TEST_FUNC)/.env run --rm -w /opt/sei/scripts/ org2-http bash -c "$(CMD_INSTALACAO_SEI)"; true - $(CMD_DOCKER_COMPOSE) -f $(PEN_TEST_FUNC)/docker-compose.yml --env-file $(PEN_TEST_FUNC)/.env run --rm -w /opt/sip/scripts/ org2-http bash -c "$(CMD_INSTALACAO_SIP)"; true - $(CMD_DOCKER_COMPOSE) -f $(PEN_TEST_FUNC)/docker-compose.yml --env-file $(PEN_TEST_FUNC)/.env run --rm -w /opt/sip/scripts/ org2-http bash -c "$(CMD_INSTALACAO_RECURSOS_SEI)"; true + $(CMD_COMPOSE_FUNC) run --rm -w /opt/sei/scripts/ org1-http bash -c "$(CMD_INSTALACAO_SEI)"; true + $(CMD_COMPOSE_FUNC) run --rm -w /opt/sip/scripts/ org1-http bash -c "$(CMD_INSTALACAO_SIP)"; true + $(CMD_COMPOSE_FUNC) run --rm -w /opt/sip/scripts/ org1-http bash -c "$(CMD_INSTALACAO_RECURSOS_SEI)"; true + $(CMD_COMPOSE_FUNC) run --rm -w /opt/sei/scripts/ org2-http bash -c "$(CMD_INSTALACAO_SEI)"; true + $(CMD_COMPOSE_FUNC) run --rm -w /opt/sip/scripts/ org2-http bash -c "$(CMD_INSTALACAO_SIP)"; true + $(CMD_COMPOSE_FUNC) run --rm -w /opt/sip/scripts/ org2-http bash -c "$(CMD_INSTALACAO_RECURSOS_SEI)"; true destroy: - $(CMD_DOCKER_COMPOSE) -f $(PEN_TEST_FUNC)/docker-compose.yml --env-file $(PEN_TEST_FUNC)/.env down --volumes + $(CMD_COMPOSE_FUNC) down --volumes down: - $(CMD_DOCKER_COMPOSE) -f $(PEN_TEST_FUNC)/docker-compose.yml --env-file $(PEN_TEST_FUNC)/.env stop + $(CMD_COMPOSE_FUNC) stop # make teste=TramiteProcessoComDevolucaoTest test-functional -test-functional: - $(CMD_DOCKER_COMPOSE) -f $(PEN_TEST_FUNC)/docker-compose.yml run --rm -w /tests php-test-functional bash -c './composer.phar install' - $(CMD_DOCKER_COMPOSE) -f $(PEN_TEST_FUNC)/docker-compose.yml --env-file $(PEN_TEST_FUNC)/.env run --rm php-test-functional /tests/vendor/bin/phpunit -c /tests/phpunit.xml /tests/tests/$(addsuffix .php,$(teste)) +test-functional: $(FILE_VENDOR_FUNCIONAL) + $(CMD_COMPOSE_FUNC) run --rm php-test-functional /tests/vendor/bin/phpunit -c /tests/phpunit.xml /tests/tests/$(addsuffix .php,$(teste)) -test-functional-parallel: - $(CMD_DOCKER_COMPOSE) -f $(PEN_TEST_FUNC)/docker-compose.yml --env-file $(PEN_TEST_FUNC)/.env run --rm php-test-functional /tests/vendor/bin/paratest -c /tests/phpunit.xml --testsuite funcional -p 8 +test-functional-parallel: $(FILE_VENDOR_FUNCIONAL) + $(CMD_COMPOSE_FUNC) run --rm php-test-functional /tests/vendor/bin/paratest -c /tests/phpunit.xml --testsuite $(TEST_SUIT) -p $(PARALLEL_TEST_NODES) $(TEST_GROUP_EXCLUIR) $(TEST_GROUP_INCLUIR) test-parallel-otimizado: make -j2 test-functional-parallel tramitar-pendencias-silent -test-unit: - $(CMD_DOCKER_COMPOSE) -f $(PEN_TEST_FUNC)/docker-compose.yml run --rm -w /tests php-test-unit bash -c './composer.phar install' - $(CMD_DOCKER_COMPOSE) -f $(PEN_TEST_FUNC)/docker-compose.yml run --rm -w /tests php-test-unit bash -c 'vendor/bin/phpunit rn/ProcessoEletronicoRNTest.php' +test-unit: $(FILE_VENDOR_UNITARIO) + $(CMD_DOCKER_COMPOSE) -f $(PEN_TEST_FUNC)/docker-compose.yml run --rm -w /tests php-test-unit bash -c 'vendor/bin/phpunit' test: test-unit test-functional verify-config: @echo "Verificando configurações do módulo para instância org1" - $(CMD_DOCKER_COMPOSE) -f $(PEN_TEST_FUNC)/docker-compose.yml --env-file $(PEN_TEST_FUNC)/.env exec org1-http php /opt/sei/scripts/mod-pen/verifica_instalacao_modulo_pen.php + $(CMD_COMPOSE_FUNC) exec org1-http php /opt/sei/scripts/mod-pen/verifica_instalacao_modulo_pen.php @echo "Verificando configurações do módulo para instância org2" - $(CMD_DOCKER_COMPOSE) -f $(PEN_TEST_FUNC)/docker-compose.yml --env-file $(PEN_TEST_FUNC)/.env exec org2-http php /opt/sei/scripts/mod-pen/verifica_instalacao_modulo_pen.php + $(CMD_COMPOSE_FUNC) exec org2-http php /opt/sei/scripts/mod-pen/verifica_instalacao_modulo_pen.php bash_org1: - $(CMD_DOCKER_COMPOSE) -f $(PEN_TEST_FUNC)/docker-compose.yml --env-file $(PEN_TEST_FUNC)/.env exec org1-http bash + $(CMD_COMPOSE_FUNC) exec org1-http bash bash_org2: - $(CMD_DOCKER_COMPOSE) -f $(PEN_TEST_FUNC)/docker-compose.yml --env-file $(PEN_TEST_FUNC)/.env exec org2-http bash + $(CMD_COMPOSE_FUNC) exec org2-http bash atualizaSequencia: docker exec -it org1-http php -c /opt/php.ini /opt/sei/scripts/atualizar_sequencias.php @@ -178,6 +218,11 @@ tramitar-pendencias: i=$$((i + 1));\ done +tramitar-pendencias-simples: + docker exec org1-http php /opt/sei/scripts/mod-pen/MonitoramentoTarefasPEN.php; \ + docker exec org2-http php /opt/sei/scripts/mod-pen/MonitoramentoTarefasPEN.php; \ + docker exec org1-http php /opt/sei/scripts/mod-pen/MonitoramentoTarefasPEN.php; + tramitar-pendencias-silent: i=1; while [ "$$i" -le 300 ]; do \ echo "Executando $$i" >/dev/null 2>&1; \ @@ -186,15 +231,6 @@ tramitar-pendencias-silent: i=$$((i + 1));\ done -update: ## Atualiza banco de dados através dos scripts de atualização do sistema - docker-compose -f $(PEN_TEST_FUNC)/docker-compose.yml --env-file $(PEN_TEST_FUNC)/.env run --rm -w /opt/sei/scripts/ org1-http bash -c "$(CMD_INSTALACAO_SEI)"; true - docker-compose -f $(PEN_TEST_FUNC)/docker-compose.yml --env-file $(PEN_TEST_FUNC)/.env run --rm -w /opt/sip/scripts/ org1-http bash -c "$(CMD_INSTALACAO_SIP)"; true - docker-compose -f $(PEN_TEST_FUNC)/docker-compose.yml --env-file $(PEN_TEST_FUNC)/.env run --rm -w /opt/sip/scripts/ org1-http bash -c "$(CMD_INSTALACAO_RECURSOS_SEI)"; true - docker-compose -f $(PEN_TEST_FUNC)/docker-compose.yml --env-file $(PEN_TEST_FUNC)/.env run --rm -w /opt/sei/scripts/ org2-http bash -c "$(CMD_INSTALACAO_SEI)"; true - docker-compose -f $(PEN_TEST_FUNC)/docker-compose.yml --env-file $(PEN_TEST_FUNC)/.env run --rm -w /opt/sip/scripts/ org2-http bash -c "$(CMD_INSTALACAO_RECURSOS_SEI)"; true - docker-compose -f $(PEN_TEST_FUNC)/docker-compose.yml --env-file $(PEN_TEST_FUNC)/.env run --rm -w /opt/sip/scripts/ org2-http bash -c "$(CMD_INSTALACAO_SIP)"; true - - #deve ser rodado em outro terminal stop-test-container: docker stop $$(docker ps -a -q --filter="name=php-test") diff --git a/README.md b/README.md index 0fdea1d40..2bf0f8cd5 100755 --- a/README.md +++ b/README.md @@ -46,8 +46,12 @@ Existem diversas formas de colaborar neste projeto: ## DESENVOLVIMENTO -Para maior informações de como configurar o ambiente de desenvolvimento do mod-sei-pen para apoiar o desenvolvimento do projeto, acesse a página [Configuração do Ambiente de Desenvolvimento](docs/DESENV.md) +Para maiores informações de como configurar o ambiente de desenvolvimento do mod-sei-pen para apoiar o desenvolvimento do projeto, acesse a página [Configuração do Ambiente de Desenvolvimento](docs/DESENV.md) +## TESTES + +Os testes implementados no projeto estão em Phpunit e Selenium. +Para maiores informações de como configurar o seu ambiente e rodar/visualizar os testes em tempo real acesse a página [Configuração dos Testes](docs/TESTE.md) ## SUPORTE diff --git a/docs/TESTE.md b/docs/TESTE.md new file mode 100644 index 000000000..ceb116da1 --- /dev/null +++ b/docs/TESTE.md @@ -0,0 +1,317 @@ +# Configuração dos Testes + +Este documento vai focar nos testes funcionais. Assim que evoluirmos os testes unitários e ou integração, referenciaremos os mesmos aqui. + +## Visão Geral dos Testes Funcionais + +Os testes estão escritos em Phpunit e rodam via Selenium. +Como está tudo em container não há a necessidade de instalar o Selenium em sua máquina. + +O projeto Makefile se encarrega de chamar os containeres necessários para a execução dos testes que ocorrem em segundo plano. + +Caso queira visualizar os testes em tempo de execução basta conectar seu cliente VNC favorito ao conteiner. + + +## Abrangência dos Testes + +Os cenários estão construídos para representar diversas situações do mundo real. Temos cenários tanto para os casos simples como envio e recebimento de processo, como para casos de simulação de erros ou excessões. Por ex: o órgão A envia um conteúdo não permitido para o órgão B e verifica se o mesmo recusou com sucesso. + +Como são muitas situações a serem cobertas o teste funcional demora a ser concluído. + +O teste funcional deve ser executado sempre antes de algum release e deve percorrer todas as bases de dados suportadas pelo PEN e também todas as versões anteriores dos Sistemas de Processo Eletrônico por ele suportada. + +Ao implementar nova funcionalidade é altamente recomendável que se crie novo teste ou adapte algum existente para testar as situações desejadas. + + +## Configuração do Ambiente para Rodar os Testes Funcionais + +### Pré-requisitos +- configure seu ambiente como descrito em: [Configuração do Ambiente de Desenvolvimento](DESENV.md) + +- teste manualmente um trâmite simples do seu sistema 1 para o sistema 2 - isso já vai estar acontecendo caso a configuração anterior tenha ocorrido com sucesso + +- para o atual escopo dos testes: o órgão 1 precisa de duas unidades mapeadas lá no barramento com direito a enviar e receber processos; o órgão 2 precisa de apenas uma unidade mapeada para enviar e receber processos + +- o passo a passo abaixo elenca como habilitar os testes para o SEI4, para os outros sistemas basta seguir de forma análoga + + +**Importante:** o teste foi feito para configurar o ambiente automaticamente de acordo com as variáveis informadas nos arquivos de configuração do projeto: comitês, unidades de envio e recebimento, tipos de documento, etc. Desta forma é aconselhável rodar os testes sempre em um ambiente novo. Caso contrário o teste poderá bagunçar as configurações que já existam naquele ambiente. Tenha isso em mente ao rodar os testes em ambientes pré-configurados. + +### 1. Escolha do sistema a ser testado + +Abra o Makefile e procure a variável "sistema" para indicar qual sistema será testado (sei3, sei4 ou super): +``` +sistema=super +``` + + +### 2. Cópia do certificado + +*Passo já executado no manual do desenvolvimento* + +Vá até a pasta tests_sei4/funcional/assets/config/ +Copie seus certifcados para os dois orgaos. +Cole-os com o nome certificado_org1.pem e certificado_org2.pem + + +### 3. Escolha da base de dados e ajustes do arquivo .env + +*Passo já executado no manual do desenvolvimento. +Aqui apenas algumas informações adicionais para multibase e multiversões* + +Agora vamos criar um arquivo .env para cada base de dados que se deseja rodar os testes. + +Vá até a pasta tests_sei4/funcional + +Nessa pasta existe um modelo .env para cada base de dados suportada. +Copie cada um deles e altere-os de acordo com a senha do seu certificado. +Você pode usar o mesmo certificado (org1 e org2) em cada uma das bases de dados, desde que não suba simultaneamente. Caso contrário vai ocorrer falha pois teremos mais de um sistema capturando os mesmos processos. + +Pontos a se alterar em cada .env: +``` +SEI_PATH=../../../../../../ +ORG1_CERTIFICADO_SENHA=XXX +ORG2_CERTIFICADO_SENHA=XXX +``` +A varável SEI_PATH pode conter o caminho absoluto ou relativo do código fonte do sistema. +Como vamos testar várias versões do mesmo sistema então de acordo com o seu fluxo de teste basta mudar ai ou criar vários .env com a informação que se deseja. + +Escolha um arquivo env com as suas modificações e renomeie-o para .env + + +### 4. Ajuste do arquivo phpunit.xml de acordo com os seus ambientes + +O arquivo phpunit.xml contém diretivas acerca da execução dos testes. Por ex: pra quem o teste vai tramitar um processo? Qual a url do sistema que vai receber? etc + +Abra o arquivo: tests_sei4/funcional/phpunit.xml + +Existem diversas diretivas aqui que podem ser alteradas, vamos elencar apenas as principais para que você consiga rodar os testes: + +``` + + + + + + + + + + + + + + + + + +``` +Onde tem XXX, YYY e ZZZ deve ser substituído com os seus valores. Esses valores você consegue no portal do barramento. Verifique o manual de configuração do desenvolvedor. + +O número SEI é um número ao seu gosto com 3 dígitos e que não pode repetir para o ORGAO_A e ORGAO_B. + +Abaixo um arquivo inteiro de um orgao que tramita em homologação, serve para exemplo: + +``` + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + tests + + + + +``` + +### 5. Rodar os Testes Funcionais + +na pasta raiz do módulo +1. suba o ambiente + ``` + make up + ``` +2. instale o módulo + ``` + make install + ``` + *Antes de rodar o install certifique-se que o sistema já subiu* + + Aqui tem uma orientação importante. O Makefile vai tentar buildar o projeto de teste. Isso só vai funcionar se vc tiver o php instalado e com as extensões corretas. Mas não é obrigatório ter o php. Esse build é a última etapa da instalação. Caso deseje você pode ignorar esse erro e rode os seguintes comandos para substituir esse passo, sem a necessidade de instalar php no seu host: + + ``` + docker exec -it org1-http bash + cd /opt/sei/web/modulos/mod-sei-pen/ + ./composer.phar install -d tests_sei4/funcional/ + ./composer.phar install -d tests_sei4/unitario/ + exit + ``` + Uma vez executando os comandos acima será gerado uma pasta "vendor" dentro da pasta funcional. Não é necessário rodar novamente a não ser q a pasta seja excluída. + + +3. rode o teste + ``` + make test-functional + ``` + + + Nesta modalidade ele vai rodar todos os testes possíveis na sequência. + A ordem é a que os arquivos são listados na pasta: tests_sei4/funcional/tests/ + Ver arquivos que terminem com *Test.php + +Caso deseje rodar apenas 1 teste, defina o mesmo no arquivo Makefile alterando a variável: +``` +teste=TramiteProcessoAnexadoTest +``` +*caso o Makefile esteja com a var setada o make test-functional vai rodar apenas o teste indicado, no caso o TramiteProcessoAnexadoTest. Verifique também que colocamos apenas o nome do arquivo sem a extensão .php* + +### 6. Rodar Rotina de Recebimento de Processos em Paralelo + +O agendamento de recebimento de processos demora 2 minutos para ocorrer. Gerando espera desnecessária no teste. Para adiantar isso pode-se abrir um novo terminal; acesse a pasta do módulo e digite: + +``` +make tramitar-pendencias +``` +*roda o processo de recebimento 4x na sequencia para cada orgao.* + +ou +``` +make tramitar-pendencias-silent +``` +*roda o processo de recebimento 300x para cada orgão* + +ou + +``` +while true; do make tramitar-pendencias; sleep 10; done +``` +*roda de dez em dez segundos o recebimento de pendências, indefinidamente.* + + +### 7. Rodar vários testes paralelamente + +Estamos experimentando o make test-functional-parallel e make test-parallel-otimizado que usando o paratest consegue rodar em paralelo os testes para melhorar a performance. Assim que tivermos maiores informações vamos atualizar aqui na documentação o seu uso. + + +### 8. Visualizar os Testes + +Os testes rodam no conteiner selenium. +O docker-compose do makefile já expõe a porta 5900 desse conteiner no host ou na sua VM. + +Para visualizar o andamento dos testes (ver o robô operando o browser), basta conectar seu cliente VNC favorito a porta 5900 da sua VM ou host. + +Por ex: caso o docker do projeto esteja rodando no seu host, basta abrir o VNC e mandar conectar no 127.0.0.1:5900 +Caso esteja rodando uma vm basta mandar conectar no ip da vm e mesma coisa, porta 5900. + +A senha para conectar via vnc é: +``` +secret +``` \ No newline at end of file diff --git a/docs/changelogs/CHANGELOG-3.2.2.md b/docs/changelogs/CHANGELOG-3.2.2.md index 0231dd9d9..d9227c52a 100644 --- a/docs/changelogs/CHANGELOG-3.2.2.md +++ b/docs/changelogs/CHANGELOG-3.2.2.md @@ -33,6 +33,14 @@ Correção de falha que impedia o envio externo de processos já tramitados pelo Falha gerava erros no envio externo de processos com a indicação de falha na validação do hash dos documentos do processo já tramitados anteriormente. +#### Manual de Configuração dos Testes + +Manual passo a passo de como configurar o ambiente localmente para rodar e visualizar os testes funcionais + +#### Jobs Jenkins + +Jobs Jenkins para automatizar os testes funcionais em versões antigas do SEI e SUPER. Atualmente disponível apenas para SEI4 + ### Atualização de Versão diff --git a/jenkins/01-Simples.groovy b/jenkins/01-Simples.groovy new file mode 100644 index 000000000..c31979a14 --- /dev/null +++ b/jenkins/01-Simples.groovy @@ -0,0 +1,528 @@ +/* + +Usuario jenkins precisa ter permissao de sudo +Jenkins minimo em 2.332 +criar secrets: +- credentialGitSpe +- org1CertSecret - secret file no jenkins com o cert all em formato pem para o orgao 1 +- org2CertSecret - secret file no jenkins com o cert all em formato pem para o orgao 2 +Obrigatorio que ele seja cadastrado no jenkins como um projeto apontando para um repo git +Nao subir direto o script no jenkins pois ele precisa do checkout inicial do repo +Nao rode ao mesmo tempo duas instancias da execucao no mesmo agente jenkins, +pois o projeto mod-sei-pen n suporta isso + +Setar os agentes com a label MOD-SEI-PEN e colocar a qtd de alocadores apenas em 1 +(para negar mais de um mesmo job ao mesmo tempo no mesmo agente, caso contrario um anula o outro) +O job 02 vai paralelizar esse job aqui portanto cd instancia deve executar em agentes separadas +e cada instancia deve usar orgas diferentes apontando para o barramento +*/ + +pipeline { + agent { + node{ + label "MOD-SEI-PEN" + } + } + + parameters { + choice( + name: 'database', + choices: "mysql\noracle\nsqlserver", + description: 'Qual o banco de dados' ) + string( + name: 'urlGitSpe', + defaultValue:"github.com:supergovbr/super.git", + description: "Url do git onde encontra-se o Sistema de Processo Eletrônico a instalar o modulo") + string( + name: 'credentialGitSpe', + defaultValue:"gitcredsuper", + description: "Jenkins Credencial do git onde encontra-se o Spe") + string( + name: 'branchGitSpe', + defaultValue:"4.0.3", + description: "Branch/Tag do git onde encontra-se o Spe") + string( + name: 'folderSpe', + defaultValue:"/home/jenkins/spe", + description: "Pasta onde vai clonar o SPE") + choice( + name: 'sistema', + choices: "sei4\nsei3\nsuper", + description: 'Qual o Sistema de Processo Eletrônico será utilizado nos testes?' ) + string( + name: 'folderModulo', + defaultValue:"/home/jenkins/modulomodseipen", + description: "Pasta onde vai copiar o modulo depois de clonado e rodar o make a partir dela. Necessario para n travar exec pois o compose ainda usa root") + booleanParam( + defaultValue: false, + name: 'bolFolderModuloDelete', + description: 'Deleta a pasta do módulo anterior. Limpa o cache do phpunit vendor e os arquivos temporarios. Aumenta o tempo de execucao') + string( + name: 'org1CertSecret', + defaultValue:"credModSeiPenOrg1Cert", + description: "Certificado de conexao ao tramita do orgao 1") + string( + name: 'passCertOrg1', + defaultValue:"VLnYTwTSXdvU83sS", + description: "Password do certificado de conexao ao tramita do orgao 1") + string( + name: 'org2CertSecret', + defaultValue:"credModSeiPenOrg2Cert", + description: "Certificado de conexao ao tramita do orgao 2") + string( + name: 'passCertOrg2', + defaultValue:"LUisD2wEtpDc6cIj", + description: "Password do certificado de conexao ao tramita do orgao 2") + string( + name: 'testParallel', + defaultValue:"3", + description: "Quantos processos simultaneos") + string( + name: 'testRetryCount', + defaultValue:"5", + description: "Quantas vezes deve repetir o teste caso o mesmo falhe") + string( + name: 'CONTEXTO_ORGAO_A_NUMERO_SEI', + defaultValue:"951") + string( + name: 'CONTEXTO_ORGAO_A_ID_REP_ESTRUTURAS', + defaultValue:"1") + string( + name: 'CONTEXTO_ORGAO_A_REP_ESTRUTURAS', + defaultValue:"Poder Executivo Federal") + string( + name: 'CONTEXTO_ORGAO_A_ID_ESTRUTURA', + defaultValue:"307") + string( + name: 'CONTEXTO_ORGAO_A_SIGLA_UNIDADE_HIERARQUIA', + defaultValue:"STF / PJ") + string( + name: 'CONTEXTO_ORGAO_A_NOME_UNIDADE', + defaultValue:"Supremo Tribunal Federal") + string( + name: 'CONTEXTO_ORGAO_A_ID_ESTRUTURA_SECUNDARIA', + defaultValue:"318") + string( + name: 'CONTEXTO_ORGAO_A_NOME_UNIDADE_SECUNDARIA', + defaultValue:"Edital") + string( + name: 'CONTEXTO_ORGAO_A_SIGLA_UNIDADE_SECUNDARIA_HIERARQUIA', + defaultValue:"ED") + string( + name: 'CONTEXTO_ORGAO_B_NUMERO_SEI', + defaultValue:"159") + string( + name: 'CONTEXTO_ORGAO_B_ID_REP_ESTRUTURAS', + defaultValue:"1") + string( + name: 'CONTEXTO_ORGAO_B_REP_ESTRUTURAS', + defaultValue:"Poder Executivo Federal") + string( + name: 'CONTEXTO_ORGAO_B_ID_ESTRUTURA', + defaultValue:"79116") + string( + name: 'CONTEXTO_ORGAO_B_SIGLA_UNIDADE_HIERARQUIA', + defaultValue:"PRODASEN") + string( + name: 'CONTEXTO_ORGAO_B_NOME_UNIDADE', + defaultValue:"Prodasen") + text( + name: 'testes', + defaultValue:"", + description: "Passe aqui os testes para rodar em uma nova suite. Caso em branco vai rodar a suite funcionais. Passe em cada linha no seguinte formato: tests/RecebimentoRecusaJustificativaGrandeTest.php\ntests/TramiteProcessoComDevolucaoTest.php") + + } + + stages { + + stage('Checkout-SISTEMA'){ + + steps { + + script{ + DATABASE = params.database + GITURL = params.urlGitSpe + GITCRED = params.credentialGitSpe + GITBRANCH = params.branchGitSpe + + FOLDERSPE = params.folderSpe + SISTEMA = params.sistema + FOLDERMODULO = params.folderModulo + BOLFOLDERMODULODEL = params.bolFolderModuloDelete + ORG1_CERT = params.org1CertSecret + ORG1_CERT_PASS= params.passCertOrg1 + ORG2_CERT = params.org2CertSecret + ORG2_CERT_PASS= params.passCertOrg2 + + TESTE_PARALLEL = params.testParallel + TEST_RETRY_COUNT = params.testRetryCount + + CONTEXTO_ORGAO_A_NUMERO_SEI = params.CONTEXTO_ORGAO_A_NUMERO_SEI + CONTEXTO_ORGAO_A_ID_REP_ESTRUTURAS = params.CONTEXTO_ORGAO_A_ID_REP_ESTRUTURAS + CONTEXTO_ORGAO_A_REP_ESTRUTURAS = params.CONTEXTO_ORGAO_A_REP_ESTRUTURAS + CONTEXTO_ORGAO_A_ID_ESTRUTURA = params.CONTEXTO_ORGAO_A_ID_ESTRUTURA + CONTEXTO_ORGAO_A_SIGLA_UNIDADE_HIERARQUIA = params.CONTEXTO_ORGAO_A_SIGLA_UNIDADE_HIERARQUIA + CONTEXTO_ORGAO_A_NOME_UNIDADE = params.CONTEXTO_ORGAO_A_NOME_UNIDADE + CONTEXTO_ORGAO_A_ID_ESTRUTURA_SECUNDARIA = params.CONTEXTO_ORGAO_A_ID_ESTRUTURA_SECUNDARIA + CONTEXTO_ORGAO_A_NOME_UNIDADE_SECUNDARIA = params.CONTEXTO_ORGAO_A_NOME_UNIDADE_SECUNDARIA + CONTEXTO_ORGAO_A_SIGLA_UNIDADE_SECUNDARIA_HIERARQUIA = params.CONTEXTO_ORGAO_A_SIGLA_UNIDADE_SECUNDARIA_HIERARQUIA + CONTEXTO_ORGAO_B_NUMERO_SEI = params.CONTEXTO_ORGAO_B_NUMERO_SEI + CONTEXTO_ORGAO_B_ID_REP_ESTRUTURAS = params.CONTEXTO_ORGAO_B_ID_REP_ESTRUTURAS + CONTEXTO_ORGAO_B_REP_ESTRUTURAS = params.CONTEXTO_ORGAO_B_REP_ESTRUTURAS + CONTEXTO_ORGAO_B_ID_ESTRUTURA = params.CONTEXTO_ORGAO_B_ID_ESTRUTURA + CONTEXTO_ORGAO_B_SIGLA_UNIDADE_HIERARQUIA = params.CONTEXTO_ORGAO_B_SIGLA_UNIDADE_HIERARQUIA + CONTEXTO_ORGAO_B_NOME_UNIDADE = params.CONTEXTO_ORGAO_B_NOME_UNIDADE + + FOLDER_FUNCIONAIS = "tests_${SISTEMA}/funcional" + + TESTES = "" + if(params.testes){ + testesarray = params.testes.split("\n") + for (i=0; i< testesarray.length; i++){ + TESTES += "" + testesarray[i] + "" + } + } + + if ( env.BUILD_NUMBER == '1' ){ + currentBuild.result = 'ABORTED' + warning('Informe os valores de parametro iniciais. Caso eles n tenham aparecido faça login novamente') + } + } + + sh """ + ifconfig || true + if [ -f ${FOLDERMODULO}/Makefile ]; then + make destroy || true + fi + + mkdir -p ${FOLDERMODULO} + sudo chown -R jenkins ${FOLDERMODULO} || true + sudo chmod +w -R ${FOLDERMODULO} || true + + if [ "${BOLFOLDERMODULODEL}" = "true" ]; then + rm -rf ${FOLDERMODULO} + mkdir -p ${FOLDERMODULO} + fi + + \\cp -R * ${FOLDERMODULO} + + """ + + dir("${FOLDERMODULO}"){ + + withCredentials([file(credentialsId: "${ORG1_CERT}", variable: 'ORG1CERT'), + file(credentialsId: "${ORG2_CERT}", variable: 'ORG2CERT')]) { + sh "cp \$ORG1CERT ${FOLDER_FUNCIONAIS}/assets/config/certificado_org1.pem" + sh "cp \$ORG2CERT ${FOLDER_FUNCIONAIS}/assets/config/certificado_org2.pem" + } + + sh script: """ + make destroy || true + + sudo chmod +r ${FOLDER_FUNCIONAIS}/assets/config/certificado_org1.pem + sudo chmod +r ${FOLDER_FUNCIONAIS}/assets/config/certificado_org2.pem + sudo rm -rf ${FOLDERSPE}/sei/config/mod-pen + sudo rm -rf ${FOLDERSPE}/sei/scripts/mod-pen + sudo rm -rf ${FOLDERSPE}/sei/web/modulos/pen + sudo rm -rf ${FOLDERSPE}/sip/config/mod-pen + sudo rm -rf ${FOLDERSPE}/sei/scripts/mod-pen + sudo rm -rf ${FOLDERSPE}/sei/config/ConfiguracaoSEI.php* + sudo rm -rf ${FOLDERSPE}/sip/config/ConfiguracaoSip.php* + + """, label: "Destroi ambiente e Remove Antigos" + + } + + + dir("${FOLDERSPE}"){ + + sh """ + git config --global http.sslVerify false + """ + + git branch: 'main', + credentialsId: GITCRED, + url: GITURL + + sh """ + git checkout ${GITBRANCH} + ls -l + """ + + } + + } + } + + stage('Subir Sistema - Instalar Modulo'){ + + steps { + retry(3){ + dir("${FOLDERMODULO}"){ + sh script: """ + make destroy || true + sed -i "s|sistema=.*|sistema=${SISTEMA}|g" Makefile + sed -i "s|PARALLEL_TEST_NODES =.*|PARALLEL_TEST_NODES = ${TESTE_PARALLEL}|g" Makefile + rm -rf ${FOLDER_FUNCIONAIS}/.env + \\cp ${FOLDER_FUNCIONAIS}/.env_${DATABASE} ${FOLDER_FUNCIONAIS}/.env + sed -i "s|SEI_PATH=.*|SEI_PATH=${FOLDERSPE}|g" ${FOLDER_FUNCIONAIS}/.env + sed -i "s|ORG1_CERTIFICADO_SENHA=.*|ORG1_CERTIFICADO_SENHA=$ORG1_CERT_PASS|g" ${FOLDER_FUNCIONAIS}/.env + sed -i "s|ORG2_CERTIFICADO_SENHA=.*|ORG2_CERTIFICADO_SENHA=$ORG2_CERT_PASS|g" ${FOLDER_FUNCIONAIS}/.env + + sed -i "s|.*PEN_WAIT_TIMEOUT\\".*||g" ${FOLDER_FUNCIONAIS}/phpunit.xml + sed -i "s|.*PEN_WAIT_TIMEOUT_ARQUIVOS_GRANDES\\".*||g" ${FOLDER_FUNCIONAIS}/phpunit.xml + sed -i "s|.*PEN_WAIT_TIMEOUT_PROCESSAMENTO_EM_LOTE\\".*||g" ${FOLDER_FUNCIONAIS}/phpunit.xml + + sed -i "s|.*CONTEXTO_ORGAO_A_NUMERO_SEI\\".*||g" ${FOLDER_FUNCIONAIS}/phpunit.xml + sed -i "s|.*CONTEXTO_ORGAO_A_ID_REP_ESTRUTURAS\\".*||g" ${FOLDER_FUNCIONAIS}/phpunit.xml + sed -i "s|.*CONTEXTO_ORGAO_A_SIGLA_UNIDADE\\".*||g" ${FOLDER_FUNCIONAIS}/phpunit.xml + sed -i "s|.*CONTEXTO_ORGAO_A_REP_ESTRUTURAS\\".*||g" ${FOLDER_FUNCIONAIS}/phpunit.xml + sed -i "s|.*CONTEXTO_ORGAO_A_ID_ESTRUTURA\\".*||g" ${FOLDER_FUNCIONAIS}/phpunit.xml + sed -i "s|.*CONTEXTO_ORGAO_A_SIGLA_UNIDADE_HIERARQUIA\\".*||g" ${FOLDER_FUNCIONAIS}/phpunit.xml + sed -i "s|.*CONTEXTO_ORGAO_A_NOME_UNIDADE\\".*||g" ${FOLDER_FUNCIONAIS}/phpunit.xml + + sed -i "s|.*CONTEXTO_ORGAO_A_SIGLA_UNIDADE_SECUNDARIA\\".*||g" ${FOLDER_FUNCIONAIS}/phpunit.xml + sed -i "s|.*CONTEXTO_ORGAO_A_ID_ESTRUTURA_SECUNDARIA\\".*||g" ${FOLDER_FUNCIONAIS}/phpunit.xml + sed -i "s|.*CONTEXTO_ORGAO_A_NOME_UNIDADE_SECUNDARIA\\".*||g" ${FOLDER_FUNCIONAIS}/phpunit.xml + sed -i "s|.*CONTEXTO_ORGAO_A_SIGLA_UNIDADE_SECUNDARIA_HIERARQUIA\\".*||g" ${FOLDER_FUNCIONAIS}/phpunit.xml + + sed -i "s|.*CONTEXTO_ORGAO_B_NUMERO_SEI\\".*||g" ${FOLDER_FUNCIONAIS}/phpunit.xml + sed -i "s|.*CONTEXTO_ORGAO_B_ID_REP_ESTRUTURAS\\".*||g" ${FOLDER_FUNCIONAIS}/phpunit.xml + sed -i "s|.*CONTEXTO_ORGAO_B_REP_ESTRUTURAS\\".*||g" ${FOLDER_FUNCIONAIS}/phpunit.xml + sed -i "s|.*CONTEXTO_ORGAO_B_SIGLA_UNIDADE\\".*||g" ${FOLDER_FUNCIONAIS}/phpunit.xml + sed -i "s|.*CONTEXTO_ORGAO_B_ID_ESTRUTURA\\".*||g" ${FOLDER_FUNCIONAIS}/phpunit.xml + sed -i "s|.*CONTEXTO_ORGAO_B_SIGLA_UNIDADE_HIERARQUIA\\".*||g" ${FOLDER_FUNCIONAIS}/phpunit.xml + sed -i "s|.*CONTEXTO_ORGAO_B_NOME_UNIDADE\\".*||g" ${FOLDER_FUNCIONAIS}/phpunit.xml + + cp ${FOLDER_FUNCIONAIS}/phpunit.xml phpunitoriginal.xml + + + make destroy + make up + make install + + pwd + """, label: "Configura sobe ambiente e instala modulo" + + script{ + if(TESTES){ + sh """ + cp phpunitoriginal.xml phpunitsubstituir.xml + sed -i "s||${TESTES}|g" phpunitsubstituir.xml + cp phpunitsubstituir.xml ${FOLDER_FUNCIONAIS}/phpunit.xml + + sed -i "s|TEST_SUIT = funcional.*|TEST_SUIT = rodarnovamente|g" Makefile + """ + } + } + } + } + + } + } + + + stage('Testes Unitarios'){ + + steps{ + dir("${FOLDERMODULO}"){ + sh script: """ + + make test-unit + + """, label: "Roda as Suites de Testes Unitarios" + } + } + + } + + + stage('Rodar Testes Funcionais'){ + + + parallel { + + stage('Testes Funcionais') { + steps { + dir("${FOLDERMODULO}"){ + + script{ + + sh "rm -rf resultado_todos.txt;" + + GRUPOS = ["excluir", "rodarseparado1", "rodarseparado2", "rodarseparado4"] + + if (TESTES) { + GRUPOS = [""] + + } + for (G in GRUPOS){ + + if (G == ""){ SUITE = "TEST_SUIT=rodarnovamente" } else { SUITE = "TEST_SUIT=funcional" } + + TEST_GROUP_EXCLUIR = "" + TEST_GROUP_INCLUIR = "" + + if(G=="excluir"){ + //SUITE="funcional2" + TEST_GROUP_EXCLUIR = 'TEST_GROUP_EXCLUIR="--exclude-group rodarseparado"' + TEST_GROUP_INCLUIR = "" + } + if(G != "excluir" && G){ + TEST_GROUP_EXCLUIR = "" + TEST_GROUP_INCLUIR = """TEST_GROUP_INCLUIR="--group ${G}" """ + } + + sh script: """ + + + + EXECUTAR_TESTES="true" + ERRCOUNT=0 + SUITE_ATUAL=${SUITE} + + while [ "\$EXECUTAR_TESTES" = "true" ]; do + + EXECUTAR_TESTES="false" + rm -rf resultado.txt + + set +e + echo "Executando Testes Funcionais..." + RESULTMAKE=\$? + make \$SUITE_ATUAL ${TEST_GROUP_EXCLUIR} ${TEST_GROUP_INCLUIR} test-functional-parallel > resultado.txt + RESULTMAKE=\$? + set -e + + cat resultado.txt >> resultado_todos.txt + + grep -o -E "[0-9]\\) .*::" resultado.txt | sed "s|::||g" | cut -d\\ -f2 | uniq > rodarnovamente.txt + + s="" + for t in \$(cat rodarnovamente.txt); do + + s="\$stests/\$t.php" + + done + + if [ ! "\$s" = "" ]; then + + ERRCOUNT=\$((ERRCOUNT+1)) + if [ \$ERRCOUNT -le ${TEST_RETRY_COUNT} ]; then + EXECUTAR_TESTES="true" + + cp phpunitoriginal.xml phpunitsubstituir.xml + sed -i "s||\$s|g" phpunitsubstituir.xml + cp phpunitsubstituir.xml ${FOLDER_FUNCIONAIS}/phpunit.xml + + SUITE_ATUAL="TEST_SUIT=rodarnovamente" + + fi + else + rm -rf rodarnovamente.txt + fi + + + done + + if [ -f "rodarnovamente.txt" ]; then + exit 1 + + fi; + + if [ ! "\$RESULTMAKE" = "0" ]; then + #vamos tentar achar erro + if [ "\$s" = "" ]; then + set +e + grep "OK" resultado.txt + RESULTMAKE=\$? + set -e + if [ ! "\$RESULTMAKE" = "0" ]; then + exit 1 + fi + + else + exit 1 + fi + + fi; + + + """, label: "Roda as Suites de Testes Funcionais" + + + + } + + } + + + } + + + } + post { + + failure { + dir("${FOLDERMODULO}"){ + sh script: """ + cat rodarnovamente.txt; + """, label: "Testes que falharam" + + sh script: """ + cat resultado.txt; + """, label: "Stack de Erros do PHPUNIT" + } + } + + always { + dir("${FOLDERMODULO}"){ + sh """ + sleep 30; + touch testesfinalizados.ok + cat resultado_todos.txt + """ + + } + } + } + + } + stage('Recebimento de Processos') { + steps { + dir("${FOLDERMODULO}"){ + sh script: """ + while [ ! -f testesfinalizados.ok ] + do + sleep 10 + make tramitar-pendencias-simples + done + """, label: "Tramitar Pendencias" + } + } + post { + always { + dir("${FOLDERMODULO}"){ + sh "rm testesfinalizados.ok" + } + } + } + } + + } + + } + + } + post { + always { + dir("${FOLDERMODULO}"){ + sh script: """ + rm -rf testesfinalizados.ok + #sudo chown -R root:jenkins ${FOLDER_FUNCIONAIS}/assets/cron.d + make destroy || true + #sudo chown -R root:jenkins ${FOLDER_FUNCIONAIS}/assets/cron.d + """, label: "Destroi Ambiente" + } + } + } +} diff --git a/jenkins/02-TodasBases.groovy b/jenkins/02-TodasBases.groovy new file mode 100644 index 000000000..333b7c69a --- /dev/null +++ b/jenkins/02-TodasBases.groovy @@ -0,0 +1,246 @@ +/* + +Usuario jenkins precisa ter permissao de sudo +Jenkins minimo em 2.332 +usa o pipeline utility plugin + +chama o job 01 de forma serializada +crie as credenciais instanciamysql, instanciasqlserver e oracle de acordo com o +modelo na pasta jenkins/assets + +*/ + +pipeline { + agent { + node{ + label "master" + } + } + + parameters { + + string( + name: 'branchGitSpe', + defaultValue:"4.0.9", + description: "Branch/Tag do git onde encontra-se o Sistema") + choice( + name: 'sistema', + choices: "sei4\nsei3\nsuper", + description: 'Qual o Sistema de Processo Eletrônico será utilizado nos testes?' ) + + + } + + stages { + + + + stage("Preparar execucao"){ + + steps{ + + script{ + + if ( env.BUILD_NUMBER == '1' ){ + currentBuild.result = 'ABORTED' + warning('Informe os valores de parametro iniciais. Caso eles n tenham aparecido faça login novamente') + } + + branchGitSpe = params.branchGitSpe + SISTEMA = params.sistema + + withCredentials([file(credentialsId: "instanciamysql", variable: 'INSTANCIA_MYSQL'), + file(credentialsId: "instanciasqlserver", variable: 'INSTANCIA_SQLSERVER'), + file(credentialsId: "instanciaoracle", variable: 'INSTANCIA_ORACLE'),]) { + sh "cp \$INSTANCIA_MYSQL instanciamysql.props" + sh "cp \$INSTANCIA_SQLSERVER instanciasqlserver.props" + sh "cp \$INSTANCIA_ORACLE instanciaoracle.props" + } + + } + + } + + } + + stage("Executar nas Bases"){ + + parallel { + stage("Mysql"){ + steps{ + script{ + + + def props = readProperties file: 'instanciamysql.props' + database = props['database'] + org1CertSecret = props['org1CertSecret'] + passCertOrg1 = props['passCertOrg1'] + org2CertSecret = props['org2CertSecret'] + passCertOrg2 = props['passCertOrg2'] + CONTEXTO_ORGAO_A_NUMERO_SEI = props['CONTEXTO_ORGAO_A_NUMERO_SEI'] + CONTEXTO_ORGAO_A_ID_REP_ESTRUTURAS = props['CONTEXTO_ORGAO_A_ID_REP_ESTRUTURAS'] + CONTEXTO_ORGAO_A_REP_ESTRUTURAS = props['CONTEXTO_ORGAO_A_REP_ESTRUTURAS'] + CONTEXTO_ORGAO_A_ID_ESTRUTURA = props['CONTEXTO_ORGAO_A_ID_ESTRUTURA'] + CONTEXTO_ORGAO_A_SIGLA_UNIDADE_HIERARQUIA = props['CONTEXTO_ORGAO_A_SIGLA_UNIDADE_HIERARQUIA'] + CONTEXTO_ORGAO_A_NOME_UNIDADE = props['CONTEXTO_ORGAO_A_NOME_UNIDADE'] + CONTEXTO_ORGAO_A_ID_ESTRUTURA_SECUNDARIA = props['CONTEXTO_ORGAO_A_ID_ESTRUTURA_SECUNDARIA'] + CONTEXTO_ORGAO_A_NOME_UNIDADE_SECUNDARIA = props['CONTEXTO_ORGAO_A_NOME_UNIDADE_SECUNDARIA'] + CONTEXTO_ORGAO_A_SIGLA_UNIDADE_SECUNDARIA_HIERARQUIA = props['CONTEXTO_ORGAO_A_SIGLA_UNIDADE_SECUNDARIA_HIERARQUIA'] + CONTEXTO_ORGAO_B_NUMERO_SEI = props['CONTEXTO_ORGAO_B_NUMERO_SEI'] + CONTEXTO_ORGAO_B_ID_REP_ESTRUTURAS = props['CONTEXTO_ORGAO_B_ID_REP_ESTRUTURAS'] + CONTEXTO_ORGAO_B_REP_ESTRUTURAS = props['CONTEXTO_ORGAO_B_REP_ESTRUTURAS'] + CONTEXTO_ORGAO_B_ID_ESTRUTURA = props['CONTEXTO_ORGAO_B_ID_ESTRUTURA'] + CONTEXTO_ORGAO_B_SIGLA_UNIDADE_HIERARQUIA = props['CONTEXTO_ORGAO_B_SIGLA_UNIDADE_HIERARQUIA'] + CONTEXTO_ORGAO_B_NOME_UNIDADE = props['CONTEXTO_ORGAO_B_NOME_UNIDADE'] + + build job: '01-Simples.groovy', + parameters: + [ + string(name: 'database', value: database), + string(name: 'org1CertSecret', value: org1CertSecret), + string(name: 'passCertOrg1', value: passCertOrg1), + string(name: 'org2CertSecret', value: org2CertSecret), + string(name: 'passCertOrg2', value: passCertOrg2), + string(name: 'CONTEXTO_ORGAO_A_NUMERO_SEI', value: CONTEXTO_ORGAO_A_NUMERO_SEI), + string(name: 'CONTEXTO_ORGAO_A_ID_REP_ESTRUTURAS', value: CONTEXTO_ORGAO_A_ID_REP_ESTRUTURAS), + string(name: 'CONTEXTO_ORGAO_A_REP_ESTRUTURAS', value: CONTEXTO_ORGAO_A_REP_ESTRUTURAS), + string(name: 'CONTEXTO_ORGAO_A_ID_ESTRUTURA', value: CONTEXTO_ORGAO_A_ID_ESTRUTURA), + string(name: 'CONTEXTO_ORGAO_A_SIGLA_UNIDADE_HIERARQUIA', value: CONTEXTO_ORGAO_A_SIGLA_UNIDADE_HIERARQUIA), + string(name: 'CONTEXTO_ORGAO_A_NOME_UNIDADE', value: CONTEXTO_ORGAO_A_NOME_UNIDADE), + string(name: 'CONTEXTO_ORGAO_A_ID_ESTRUTURA_SECUNDARIA', value: CONTEXTO_ORGAO_A_ID_ESTRUTURA_SECUNDARIA), + string(name: 'CONTEXTO_ORGAO_A_NOME_UNIDADE_SECUNDARIA', value: CONTEXTO_ORGAO_A_NOME_UNIDADE_SECUNDARIA), + string(name: 'CONTEXTO_ORGAO_A_SIGLA_UNIDADE_SECUNDARIA_HIERARQUIA', value: CONTEXTO_ORGAO_A_SIGLA_UNIDADE_SECUNDARIA_HIERARQUIA), + string(name: 'CONTEXTO_ORGAO_B_NUMERO_SEI', value: CONTEXTO_ORGAO_B_NUMERO_SEI), + string(name: 'CONTEXTO_ORGAO_B_ID_REP_ESTRUTURAS', value: CONTEXTO_ORGAO_B_ID_REP_ESTRUTURAS), + string(name: 'CONTEXTO_ORGAO_B_REP_ESTRUTURAS', value: CONTEXTO_ORGAO_B_REP_ESTRUTURAS), + string(name: 'CONTEXTO_ORGAO_B_ID_ESTRUTURA', value: CONTEXTO_ORGAO_B_ID_ESTRUTURA), + string(name: 'CONTEXTO_ORGAO_B_SIGLA_UNIDADE_HIERARQUIA', value: CONTEXTO_ORGAO_B_SIGLA_UNIDADE_HIERARQUIA), + string(name: 'CONTEXTO_ORGAO_B_NOME_UNIDADE', value: CONTEXTO_ORGAO_B_NOME_UNIDADE), + string(name: 'branchGitSpe', value: branchGitSpe), + string(name: 'sistema', value: SISTEMA), + ], wait: true + }} + + } + + stage("SqlServer"){ + + steps{ + script{ + + + def props = readProperties file: 'instanciasqlserver.props' + database = props['database'] + org1CertSecret = props['org1CertSecret'] + passCertOrg1 = props['passCertOrg1'] + org2CertSecret = props['org2CertSecret'] + passCertOrg2 = props['passCertOrg2'] + CONTEXTO_ORGAO_A_NUMERO_SEI = props['CONTEXTO_ORGAO_A_NUMERO_SEI'] + CONTEXTO_ORGAO_A_ID_REP_ESTRUTURAS = props['CONTEXTO_ORGAO_A_ID_REP_ESTRUTURAS'] + CONTEXTO_ORGAO_A_REP_ESTRUTURAS = props['CONTEXTO_ORGAO_A_REP_ESTRUTURAS'] + CONTEXTO_ORGAO_A_ID_ESTRUTURA = props['CONTEXTO_ORGAO_A_ID_ESTRUTURA'] + CONTEXTO_ORGAO_A_SIGLA_UNIDADE_HIERARQUIA = props['CONTEXTO_ORGAO_A_SIGLA_UNIDADE_HIERARQUIA'] + CONTEXTO_ORGAO_A_NOME_UNIDADE = props['CONTEXTO_ORGAO_A_NOME_UNIDADE'] + CONTEXTO_ORGAO_A_ID_ESTRUTURA_SECUNDARIA = props['CONTEXTO_ORGAO_A_ID_ESTRUTURA_SECUNDARIA'] + CONTEXTO_ORGAO_A_NOME_UNIDADE_SECUNDARIA = props['CONTEXTO_ORGAO_A_NOME_UNIDADE_SECUNDARIA'] + CONTEXTO_ORGAO_A_SIGLA_UNIDADE_SECUNDARIA_HIERARQUIA = props['CONTEXTO_ORGAO_A_SIGLA_UNIDADE_SECUNDARIA_HIERARQUIA'] + CONTEXTO_ORGAO_B_NUMERO_SEI = props['CONTEXTO_ORGAO_B_NUMERO_SEI'] + CONTEXTO_ORGAO_B_ID_REP_ESTRUTURAS = props['CONTEXTO_ORGAO_B_ID_REP_ESTRUTURAS'] + CONTEXTO_ORGAO_B_REP_ESTRUTURAS = props['CONTEXTO_ORGAO_B_REP_ESTRUTURAS'] + CONTEXTO_ORGAO_B_ID_ESTRUTURA = props['CONTEXTO_ORGAO_B_ID_ESTRUTURA'] + CONTEXTO_ORGAO_B_SIGLA_UNIDADE_HIERARQUIA = props['CONTEXTO_ORGAO_B_SIGLA_UNIDADE_HIERARQUIA'] + CONTEXTO_ORGAO_B_NOME_UNIDADE = props['CONTEXTO_ORGAO_B_NOME_UNIDADE'] + + build job: '01-Simples.groovy', + parameters: + [ + string(name: 'database', value: database), + string(name: 'org1CertSecret', value: org1CertSecret), + string(name: 'passCertOrg1', value: passCertOrg1), + string(name: 'org2CertSecret', value: org2CertSecret), + string(name: 'passCertOrg2', value: passCertOrg2), + string(name: 'CONTEXTO_ORGAO_A_NUMERO_SEI', value: CONTEXTO_ORGAO_A_NUMERO_SEI), + string(name: 'CONTEXTO_ORGAO_A_ID_REP_ESTRUTURAS', value: CONTEXTO_ORGAO_A_ID_REP_ESTRUTURAS), + string(name: 'CONTEXTO_ORGAO_A_REP_ESTRUTURAS', value: CONTEXTO_ORGAO_A_REP_ESTRUTURAS), + string(name: 'CONTEXTO_ORGAO_A_ID_ESTRUTURA', value: CONTEXTO_ORGAO_A_ID_ESTRUTURA), + string(name: 'CONTEXTO_ORGAO_A_SIGLA_UNIDADE_HIERARQUIA', value: CONTEXTO_ORGAO_A_SIGLA_UNIDADE_HIERARQUIA), + string(name: 'CONTEXTO_ORGAO_A_NOME_UNIDADE', value: CONTEXTO_ORGAO_A_NOME_UNIDADE), + string(name: 'CONTEXTO_ORGAO_A_ID_ESTRUTURA_SECUNDARIA', value: CONTEXTO_ORGAO_A_ID_ESTRUTURA_SECUNDARIA), + string(name: 'CONTEXTO_ORGAO_A_NOME_UNIDADE_SECUNDARIA', value: CONTEXTO_ORGAO_A_NOME_UNIDADE_SECUNDARIA), + string(name: 'CONTEXTO_ORGAO_A_SIGLA_UNIDADE_SECUNDARIA_HIERARQUIA', value: CONTEXTO_ORGAO_A_SIGLA_UNIDADE_SECUNDARIA_HIERARQUIA), + string(name: 'CONTEXTO_ORGAO_B_NUMERO_SEI', value: CONTEXTO_ORGAO_B_NUMERO_SEI), + string(name: 'CONTEXTO_ORGAO_B_ID_REP_ESTRUTURAS', value: CONTEXTO_ORGAO_B_ID_REP_ESTRUTURAS), + string(name: 'CONTEXTO_ORGAO_B_REP_ESTRUTURAS', value: CONTEXTO_ORGAO_B_REP_ESTRUTURAS), + string(name: 'CONTEXTO_ORGAO_B_ID_ESTRUTURA', value: CONTEXTO_ORGAO_B_ID_ESTRUTURA), + string(name: 'CONTEXTO_ORGAO_B_SIGLA_UNIDADE_HIERARQUIA', value: CONTEXTO_ORGAO_B_SIGLA_UNIDADE_HIERARQUIA), + string(name: 'CONTEXTO_ORGAO_B_NOME_UNIDADE', value: CONTEXTO_ORGAO_B_NOME_UNIDADE), + string(name: 'sistema', value: SISTEMA), + ], wait: true + }} + + } + + stage("Oracle"){ + + steps{ + script{ + + def props = readProperties file: 'instanciaoracle.props' + database = props['database'] + org1CertSecret = props['org1CertSecret'] + passCertOrg1 = props['passCertOrg1'] + org2CertSecret = props['org2CertSecret'] + passCertOrg2 = props['passCertOrg2'] + CONTEXTO_ORGAO_A_NUMERO_SEI = props['CONTEXTO_ORGAO_A_NUMERO_SEI'] + CONTEXTO_ORGAO_A_ID_REP_ESTRUTURAS = props['CONTEXTO_ORGAO_A_ID_REP_ESTRUTURAS'] + CONTEXTO_ORGAO_A_REP_ESTRUTURAS = props['CONTEXTO_ORGAO_A_REP_ESTRUTURAS'] + CONTEXTO_ORGAO_A_ID_ESTRUTURA = props['CONTEXTO_ORGAO_A_ID_ESTRUTURA'] + CONTEXTO_ORGAO_A_SIGLA_UNIDADE_HIERARQUIA = props['CONTEXTO_ORGAO_A_SIGLA_UNIDADE_HIERARQUIA'] + CONTEXTO_ORGAO_A_NOME_UNIDADE = props['CONTEXTO_ORGAO_A_NOME_UNIDADE'] + CONTEXTO_ORGAO_A_ID_ESTRUTURA_SECUNDARIA = props['CONTEXTO_ORGAO_A_ID_ESTRUTURA_SECUNDARIA'] + CONTEXTO_ORGAO_A_NOME_UNIDADE_SECUNDARIA = props['CONTEXTO_ORGAO_A_NOME_UNIDADE_SECUNDARIA'] + CONTEXTO_ORGAO_A_SIGLA_UNIDADE_SECUNDARIA_HIERARQUIA = props['CONTEXTO_ORGAO_A_SIGLA_UNIDADE_SECUNDARIA_HIERARQUIA'] + CONTEXTO_ORGAO_B_NUMERO_SEI = props['CONTEXTO_ORGAO_B_NUMERO_SEI'] + CONTEXTO_ORGAO_B_ID_REP_ESTRUTURAS = props['CONTEXTO_ORGAO_B_ID_REP_ESTRUTURAS'] + CONTEXTO_ORGAO_B_REP_ESTRUTURAS = props['CONTEXTO_ORGAO_B_REP_ESTRUTURAS'] + CONTEXTO_ORGAO_B_ID_ESTRUTURA = props['CONTEXTO_ORGAO_B_ID_ESTRUTURA'] + CONTEXTO_ORGAO_B_SIGLA_UNIDADE_HIERARQUIA = props['CONTEXTO_ORGAO_B_SIGLA_UNIDADE_HIERARQUIA'] + CONTEXTO_ORGAO_B_NOME_UNIDADE = props['CONTEXTO_ORGAO_B_NOME_UNIDADE'] + + build job: '01-Simples.groovy', + parameters: + [ + string(name: 'database', value: database), + string(name: 'org1CertSecret', value: org1CertSecret), + string(name: 'passCertOrg1', value: passCertOrg1), + string(name: 'org2CertSecret', value: org2CertSecret), + string(name: 'passCertOrg2', value: passCertOrg2), + string(name: 'CONTEXTO_ORGAO_A_NUMERO_SEI', value: CONTEXTO_ORGAO_A_NUMERO_SEI), + string(name: 'CONTEXTO_ORGAO_A_ID_REP_ESTRUTURAS', value: CONTEXTO_ORGAO_A_ID_REP_ESTRUTURAS), + string(name: 'CONTEXTO_ORGAO_A_REP_ESTRUTURAS', value: CONTEXTO_ORGAO_A_REP_ESTRUTURAS), + string(name: 'CONTEXTO_ORGAO_A_ID_ESTRUTURA', value: CONTEXTO_ORGAO_A_ID_ESTRUTURA), + string(name: 'CONTEXTO_ORGAO_A_SIGLA_UNIDADE_HIERARQUIA', value: CONTEXTO_ORGAO_A_SIGLA_UNIDADE_HIERARQUIA), + string(name: 'CONTEXTO_ORGAO_A_NOME_UNIDADE', value: CONTEXTO_ORGAO_A_NOME_UNIDADE), + string(name: 'CONTEXTO_ORGAO_A_ID_ESTRUTURA_SECUNDARIA', value: CONTEXTO_ORGAO_A_ID_ESTRUTURA_SECUNDARIA), + string(name: 'CONTEXTO_ORGAO_A_NOME_UNIDADE_SECUNDARIA', value: CONTEXTO_ORGAO_A_NOME_UNIDADE_SECUNDARIA), + string(name: 'CONTEXTO_ORGAO_A_SIGLA_UNIDADE_SECUNDARIA_HIERARQUIA', value: CONTEXTO_ORGAO_A_SIGLA_UNIDADE_SECUNDARIA_HIERARQUIA), + string(name: 'CONTEXTO_ORGAO_B_NUMERO_SEI', value: CONTEXTO_ORGAO_B_NUMERO_SEI), + string(name: 'CONTEXTO_ORGAO_B_ID_REP_ESTRUTURAS', value: CONTEXTO_ORGAO_B_ID_REP_ESTRUTURAS), + string(name: 'CONTEXTO_ORGAO_B_REP_ESTRUTURAS', value: CONTEXTO_ORGAO_B_REP_ESTRUTURAS), + string(name: 'CONTEXTO_ORGAO_B_ID_ESTRUTURA', value: CONTEXTO_ORGAO_B_ID_ESTRUTURA), + string(name: 'CONTEXTO_ORGAO_B_SIGLA_UNIDADE_HIERARQUIA', value: CONTEXTO_ORGAO_B_SIGLA_UNIDADE_HIERARQUIA), + string(name: 'CONTEXTO_ORGAO_B_NOME_UNIDADE', value: CONTEXTO_ORGAO_B_NOME_UNIDADE), + string(name: 'sistema', value: SISTEMA), + ], wait: true + }} + + } + } + + } + + + + } + +} diff --git a/jenkins/03-TodasVersoes.groovy b/jenkins/03-TodasVersoes.groovy new file mode 100644 index 000000000..96bef200d --- /dev/null +++ b/jenkins/03-TodasVersoes.groovy @@ -0,0 +1,99 @@ +/* + +Usuario jenkins precisa ter permissao de sudo +Jenkins minimo em 2.332 + +chama o job 02 de forma serializada + +*/ + +pipeline { + agent { + node{ + label "master" + } + } + + options { + disableConcurrentBuilds() + } + + parameters { + + string( + name: 'versoes', + defaultValue:"SPE=4.0.8,NOME_SPE=sei4,VERSAO_MODULO=3.0.2;SPE=4.0.9,NOME_SPE=sei4,VERSAO_MODULO=3.0.2;", + description: "Lista de versoes do SPE e modulo no formato como exemplo acima, separados por ;") + + + } + + stages { + + + + stage("Preparar execucao"){ + + steps{ + + script{ + + if ( env.BUILD_NUMBER == '1' ){ + currentBuild.result = 'ABORTED' + warning('Informe os valores de parametro iniciais. Caso eles n tenham aparecido faça login novamente') + } + + QTDTENTATIVAS=0 + VERSOES_STRING = params.versoes + arrGeneral = VERSOES_STRING.split(';') + } + + } + + } + + stage("Executar nas Bases"){ + steps { + script { + + def paramValue + def spe_branch + def spe_controle_versao + def modulo_versao + + for (int i = 0; i < arrGeneral.length; i++) { + paramValue = arrGeneral[i].split(',') + spe_branch = paramValue[0].split('=')[1] + spe_nome = paramValue[1].split('=')[1] + modulo_versao = paramValue[2].split('=')[1] + + stage("Montando Ambiente Rodando Testes ${paramValue[0]} / ${paramValue[1]} / ${paramValue[2]}" ) { + + warnError('Erro no build!'){ + + retry(QTDTENTATIVAS){ + + + build job: '02-TodasBases.groovy', + parameters: + [ + string(name: 'branchGitSpe', value: spe_branch), + string(name: 'sistema', value: spe_nome), + string(name: 'versaoModulo', value: modulo_versao), + ], wait: true + } + + } + + } + + + } + + } + } + + } + } + +} diff --git a/jenkins/assets/jenkins-modseipen-sei4-instanciamysql.txt.modelo b/jenkins/assets/jenkins-modseipen-sei4-instanciamysql.txt.modelo new file mode 100644 index 000000000..17bcf1e35 --- /dev/null +++ b/jenkins/assets/jenkins-modseipen-sei4-instanciamysql.txt.modelo @@ -0,0 +1,23 @@ +database=mysql +org1CertSecret=credModSeiPenOrg1Cert-mysql +passCertOrg1=XXXXXX + +org2CertSecret=credModSeiPenOrg2Cert-mysql +passCertOrg2=XXXXXX + +CONTEXTO_ORGAO_A_NUMERO_SEI=XXX +CONTEXTO_ORGAO_A_ID_REP_ESTRUTURAS=XXXX +CONTEXTO_ORGAO_A_REP_ESTRUTURAS=XXX +CONTEXTO_ORGAO_A_ID_ESTRUTURA=XXX +CONTEXTO_ORGAO_A_SIGLA_UNIDADE_HIERARQUIA=XXX +CONTEXTO_ORGAO_A_NOME_UNIDADE=XXX +CONTEXTO_ORGAO_A_ID_ESTRUTURA_SECUNDARIA=XXX +CONTEXTO_ORGAO_A_NOME_UNIDADE_SECUNDARIA=XXX +CONTEXTO_ORGAO_A_SIGLA_UNIDADE_SECUNDARIA_HIERARQUIA=XXX + +CONTEXTO_ORGAO_B_NUMERO_SEI=XXX +CONTEXTO_ORGAO_B_ID_REP_ESTRUTURAS=XXX +CONTEXTO_ORGAO_B_REP_ESTRUTURAS=XXX +CONTEXTO_ORGAO_B_ID_ESTRUTURA=XXX +CONTEXTO_ORGAO_B_SIGLA_UNIDADE_HIERARQUIA=XXX +CONTEXTO_ORGAO_B_NOME_UNIDADE=XXX \ No newline at end of file diff --git a/tests_sei4/funcional/docker-compose.yml b/tests_sei4/funcional/docker-compose.yml index 0ff3f9266..fd8a2bae0 100644 --- a/tests_sei4/funcional/docker-compose.yml +++ b/tests_sei4/funcional/docker-compose.yml @@ -71,7 +71,7 @@ services: - "host.docker.internal:host-gateway" links: - org1-database:${ORG1_DATABASE_HOST} - - org2-database:${ORG1_DATABASE_HOST} + - org2-database:${ORG2_DATABASE_HOST} - selenium:selenium command: "true" diff --git a/tests_sei4/funcional/phpunit.xml b/tests_sei4/funcional/phpunit.xml index 4e56b2840..d5a53d7c5 100755 --- a/tests_sei4/funcional/phpunit.xml +++ b/tests_sei4/funcional/phpunit.xml @@ -112,5 +112,8 @@ tests + + + diff --git a/tests_sei4/funcional/src/paginas/PaginaIniciarProcesso.php b/tests_sei4/funcional/src/paginas/PaginaIniciarProcesso.php index 465494430..4ab8a8a98 100755 --- a/tests_sei4/funcional/src/paginas/PaginaIniciarProcesso.php +++ b/tests_sei4/funcional/src/paginas/PaginaIniciarProcesso.php @@ -163,7 +163,7 @@ public static function gerarProcessoTeste($test, array $dadosProcesso = null) $test->frame(null); $test->frame("ifrArvore"); - $protocoloProcesso = trim($test->byXPath("//span[@title='". $dadosProcesso["TIPO_PROCESSO"] ."']")->text()); + $protocoloProcesso = trim($test->byXPath("//a[@title='". $dadosProcesso["TIPO_PROCESSO"] ."'] | //span[@title='". $dadosProcesso["TIPO_PROCESSO"] ."']")->text()); return $protocoloProcesso; } diff --git a/tests_sei4/funcional/src/paginas/PaginaProcesso.php b/tests_sei4/funcional/src/paginas/PaginaProcesso.php index 180f02ce0..2b9c8294d 100755 --- a/tests_sei4/funcional/src/paginas/PaginaProcesso.php +++ b/tests_sei4/funcional/src/paginas/PaginaProcesso.php @@ -158,7 +158,7 @@ public function deveSerDocumentoAnexo($bolDevePossuir, $nomeDocumentoArvore) $this->test->frame(null); $this->test->frame("ifrArvore"); if($bolDevePossuir){ - $idAnexo=$this->test->byXPath("//span[contains(@title,'" . $nomeDocumentoArvore . "')]")->attribute('id'); + $idAnexo=$this->test->byXPath("//span[contains(text(),'" . $nomeDocumentoArvore . "')]")->attribute('id'); $idAnexo=str_replace("span","",$idAnexo); $this->test->byXPath("//img[contains(@id,'iconMD_PEN_DOC_REF" . $idAnexo . "')]"); } diff --git a/tests_sei4/funcional/src/paginas/PaginaTeste.php b/tests_sei4/funcional/src/paginas/PaginaTeste.php index 95d25628c..9a2bc71c2 100755 --- a/tests_sei4/funcional/src/paginas/PaginaTeste.php +++ b/tests_sei4/funcional/src/paginas/PaginaTeste.php @@ -48,7 +48,7 @@ public function navegarParaControleProcesso() public function sairSistema() { $this->test->frame(null); - $this->test->byXPath("(//a[@id='lnkSairSistema'])")->click(); + $this->test->byXPath("//a[@id='lnkInfraSairSistema'] | //a[@id='lnkSairSistema']")->click(); } public static function selecionarUnidadeContexto($test, $unidadeContexto) diff --git a/tests_sei4/funcional/tests/TramiteProcessoComCancelamentoTest.php b/tests_sei4/funcional/tests/TramiteProcessoComCancelamentoTest.php index 3d0906397..05f9c24c4 100755 --- a/tests_sei4/funcional/tests/TramiteProcessoComCancelamentoTest.php +++ b/tests_sei4/funcional/tests/TramiteProcessoComCancelamentoTest.php @@ -1,6 +1,6 @@