Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

...

Deck of Cards
id1
Card
id1A
labelUSUÁRIOS
Painel
borderColorambar
borderStylesolid
titleUsuários

O TCGI possui dois usuários, Squad TCGI Core e Squad TCGI Jornada e Locação

TCGI Core:

TCGI Jornada:

Card
id1B
labelAGENDAMENTOS
Painel
borderStylesolid
titleAgendamentos

Do usuário Squad TCGI Jornada e Locação

PVI: Postman: PVI_Tests (2209, 2302, 2306 e 2310)


Estes agendamentos são importantes pois passam nos processos básicos / críticos do Portal de Imóveis. Esses projetos não rodam na IC. Disparam todos os dias às 17:05 na VM BH-ENG-AUTTIN01.

É importante conferi-los diariamente acessando o log do agendamento de todas as versões como mostra a imagem abaixo:

É enviado e-mail para a equipe caso exista algum projeto com falhas.

Atualizador de Ambientes TOTVS Restore (2209, 2302, 2306 e 2310)


O agendamento Atualizador de Ambientes TOTVS Restore roda todos os dias às 16:30 e irá atualizar os três servidores (BH-ENG-AUTTIN01, BH-ENG-AUTTIN02, BH-ENG-AUTTINPR) com as últimas versões do mercado 2209, 2302, 2306 e Atual 2310. 

Para que a atualização ocorra - os três servidores devem ter o Restore iniciado e o Agent em execução. 

Importante: O agendamento Atualizador de Ambientes TOTVS Restore AUTTINPR além de atualizar o servidor BH-ENG-AUTTINPR às 16:30, também irá realizar uma tentativa de fazer a atualização de scripts na versão atual de todos os bancos de dados (tanto Core e Jornada).

É importante verificar diariamente esse agendamento, através do seu log específico se não está ocorrendo erros na atualização dos bancos de dados. 

Neste agendamento são atualizados os bancos nos diretórios abaixo:

  • \\bh-autbdcp\BasesAutomacao\v1200\1212310\Imb-Imobiliario\SQL\Aluguel
  • \\bh-autbdcp\BasesAutomacao\v1200\1212310\Imb-Imobiliario\SQL\Refatoração
  • \\bh-autbdcp\BasesAutomacao\v1200\1212310\PVI\SQL

No caso do Portal de Imóveis, apenas a base RM é convertida.

O processo de atualização realiza um backup no mesmo diretório. É importante limpar estes backups caso estejam ocupando muito espaço.

Exemplo:

Os arquivos sublinhados na imagem são os arquivos de backup realizados pelo agendamento e são seguros para exclusão. Normalmente deixamos apenas os dois últimos backups realizados por segurança / precaução.

Atente-se a data no nome do arquivo e faça a deleção do mais antigo para o mais novo.

Requer Execução e Erro/Alerta (2209, 2302, 2306 e 2310)


Este agendamento irá ser disparado todos os dias, às 19:10 e tem por objetivo executar todos os projetos que possuem em seu status "Erro/Alerta" ou "Requer Execução".
Existe um agendamento para cada versão de mercado e também para a versão atual. 

Exclusão de Bases dos Servidores    


O próprio nome já diz. Este agendamento possui uma consulta SQL que é disparada no servidor BH-AUTBDCP e deleta todos os bancos temporários do servidor. Este agendamento é executado diariamente às 12:30

Card
id1C
labelCOBERTURA DE CÓDIGO
Painel
titleCobertura de Código

Todos os projetos devem ter sua cobertura de código coletada. É importante que, ao criar um projeto e versioná-lo para a versão Atual, o mesmo deve ter o seu código coletado pela engenharia. Lembre-se de disparar a coleta através do menu lateral Cobertura de Código no TestFlow.

Card
id1D
labelANÁLISE DE PROJETOS COM FALHAS
Painel
titleAnálise de Projetos com Falhas

Exemplo de um Projeto com erros na CT:

Ao verificar o log clicando em Erro/Alerta percebo que algumas atividades estão com erro.

Isso deve-se ao fato de que alguma atividade do tipo webservice não executou de forma correta.

Temos que nos atentar que, mesmo o Test Flow mostrando que o WS executou com sucesso, não quer dizer que o resultado do processo tenha sido o esperado.

Então não é só por que a atividade está com sucesso que ela executou corretamente.

Neste caso tenho uma atividade de geração de lançamentos com falhas. Veja que o Test Flow não mostra o erro no print acima, mas somente quando clicamos no "olhinho". Dessa forma temos que investigar sempre nestes cenários onde a consulta SQL está com erro se algum WS executou de forma errada.

Vemos aqui que a atividade Gerar lançamentos do Fechamento executou com um resultado não esperado.

Para entender melhor esse log normalmente substituímos a atividade que fecha o projeto por uma atividade C# "Faz Nada". Dessa forma o projeto irá executar no ambiente e irá parar sem deletar o banco. E então podemos acessá-lo e verificar os logs de execução:

Substituindo e salvando, iremos executar novamente o projeto em uma VM.

Dentro do RM, posso ir em Ambiente / Gerenciamento de Jobs e encontrar o processo que ocasionou o erro, filtrando pela data de hoje.

Ao clicar no processo de gerar lançamentos podemos entender melhor o log e verificar se é um bug ou se o projeto precisa ser alterado, facilitando a análise do erro.

OUTROS PROBLEMAS COMUNS / SOLUÇÕES

Queda do agent dos servidores:

Solução: Reiniciar o agent e avaliar o estado das execuções. O agent.exe deve obrigatoriamente ser executado como administrador

É importante verificar também se o TOTVS.Restore está em execução nas três VM's

Espaço do servidor BH-AUTBDCP\SQL2019:

Solução: Contactar um usuário administrador para efetuar a limpeza. Os admins desse servidor são:

Com o agendamento de limpeza de bancos normalmente estes problemas não ocorrem mais. Porém, pode acontecer da instância do SQLServer estar parada. Dessa forma é preciso logar no servidor e iniciá-la manualmente.

Erros do script na versão atual por falta de campos:

Este erro é bastante comum e é mitigado com o agendamento atualizador de bases. Porém ainda há momentos em que o código que necessita do script já está no restore porém o script ainda não. Nestes casos, devemos aguardar e não executar de forma manual os scripts de banco.

Solução: Atualizar a base de automação, utilizando o último RM.Atualizador para popular a base com os novos scripts.

O Script abaixo desbloqueia um banco que esteja com erros para fins de teste na versão 1212310.

Bloco de código
languagesql
DELETE FROM GUPGATUALIZACAO
WHERE VERSAO = '12.1.2310.0'

INSERT INTO GUPGATUALIZACAO (VERSAO, DATAINICIO, DATAFIM, INFORMACOES, AVISOS, ERROS, ERROSCRITICOS, LOGEXEC, UPGKEY, RECCREATEDBY, RECCREATEDON, RECMODIFIEDBY, RECMODIFIEDON, EXECUTING, ENABLECOMPRESSION, SERVERADDRESS, PROTOCOL)
VALUES('12.1.2310.0', GETDATE(), GETDATE(), 7, 0, 0, 0, NULL, '\8E\B2\D3\17\1D\BFW\F3\A5\D9\CA\AE3\D4\C1\A9E\23\B6\2F\14u\B4I\06\1E\EA\0BQ\ED\95\D0\E8uMG\7B7\18\E13\05\FAr\8D\C9\DF\21\05\CA\A7\FC\EE\F6\C0\A8\1AA\1A\15\F1\D79\12\AA\0F\21\82\83y9\D8', 'totvs-upg', GETDATE(), 'totvs-upg', GETDATE(), 0, 0, 'net.tcp://BH-ENG-AUTTIN01:8051/', 0)
GO

Erros Winforms de timeout ou clique:

Solução: A grande maioria dos erros em scripts Winforms ocorrem de forma intermitente, a solução nestes casos é a reexecução do script com problema.

Aguardar a execução do script Winforms via agendamento. Caso o erro persista após nova reexecução devemos verificar.

Card
id1E
labelTREINAMENTOS E LINKS
Painel
titleTreinamentos e Links

Abaixo alguns links para treinamentos e apostilas e o help do Test Flow

Help

Novidades

Boas Práticas

Capacitações

Criação de projetos Web Services e API's

Status dos servidores: (Os links abaixo só funcionam com um usuário logado) 

Repositório TestFlow (Agent e pasta TestFlow)

  • \\bhengfiles\rmflex$\Outros\Ferramentas\TestFlow2.0

Caminho dos arquivos .json que executam nas automações do Postman:

  • \\bh-autbdcp\BasesAutomacao\v1200\{{versao}}\Imb-Imobiliario\restFul
  • \\bh-autbdcp\BasesAutomacao\v1200\{{versao}}\PVI\restFul

Bases TestFlow

  • \\bh-autbdcp\BasesAutomacao\v1200
  • \\bh-autbdcp\BasesAutomacao\ORA (BAT PARA SERVIDOR ORACLE)

Servidor oficial da automação Construção e Projetos 

  • Servidor: BH-AUTBDCP\SQL2019
  • Usuário: rm/rm

Servidores de Execução TCGI (VM’S)

  • BH-ENG-AUTTIN01AUTTIN01 
  • BH-ENG-AUTTIN02AUTTIN02 
  • BH-ENG-AUTTINPR

Os usuários listados abaixo são administradores dos servidores. Caso necessite acesso, favor contatá-los.

Portal de Cobertura de Código:

Dashboard da IC e CT

Informações
titleApostilas
Card
id1F
labelDICAS WINFORMS
Painel

Ajustando Scripts Winforms


O jeito mais simples de ajustar os scripts Winforms é reexecutando os mesmos com um tempo mais elevado entre as ações e entre as janelas.

Por padrão temos um tempo entre janelas de 300 segundos e entre ações de 5 segundos.

Em alguns momentos talvez possa ser necessário ajustar esse tempo, principalmente na cobertura de código, onde os scripts executam num ambiente mais carregado e lento.

Para alterar o tempo de um script winforms basta acessá-lo via edição dentro do projeto:

Image Added

Os parâmetros a seguir devem ser ajustados:

Image Added

Usar sempre um tempo do tipo Fixo.

O mesmo padrão deverá ser usado na aba "Aguardar Janelas".

Editando ações winforms


As vezes quando temos mudança de posições do menu de processos os scripts podem quebrar. Quando um novo processo surge e altera a posição dos menus antigos. Nestes casos, podemos alterar diretamente na ação que clica no menu seguindo os passos abaixo:

Clicar na ação que clica no processo e que está com erro:

Image Added

Veja que sua posição está definida como btnProcess_10

Porem nesse exemplo esse processo no RM já está definido como btnProcess_11, por isso o erro.

Podemos editar diretamente essa ação clicando com o mouse em "WinformControlBase" e dando um Tab.

Image Added

Após o ajuste, basta clicar em salvar na ação:

Image Added





Card
id1G
labelSELENIUM
Painel

TEMPLATE CODIGO SELENIUM



Bloco de código
languagec#
using System;
using System.IO;
using System.Reflection;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using OpenQA.Selenium.Firefox;
using OpenQA.Selenium.IE;
using OpenQA.Selenium.PhantomJS;
using OpenQA.Selenium.Support.UI;
using TestFlow.Core.Contracts;
using TestFlow.Common.Contracts;
using TestFlow.Common;
using TestFlow.Business.Contracts;
using TestFlow.Core.ServiceModel;

namespace TestFlow
{
  public class TestFlowCSharpCode : TestFlowActionBase
  {
public override TestResult DoWork(IEnumerable<IResourceExchange> resourceExchange, CancellationToken cancellationToken)
{
  // Cria uma instancia da classe de ScriptWebBase...
  var scriptWebBase = new SeleniumWebDriver();

  try
  {
Browser browser;
string url;

// Executa o código antes do Teste
scriptWebBase.BeforeTest(out browser, out url);

var jsonResource = resourceExchange.LastOrDefault(r => r is IJsonResource);
var PostmanParams = ((IJsonResource)jsonResource).GetResource<PostmanParams>();
            string chromeDriverPath = PostmanParams.chromeDriverPath;
            
            // Defina o serviço do ChromeDriver com o caminho personalizado
            ChromeDriverService service = ChromeDriverService.CreateDefaultService(chromeDriverPath);
        
            // Cria o Driver para o Chrome
            ChromeOptions options = new ChromeOptions();
            options.AddArgument("--disable-extensions");
            options.AddArgument("start-maximized"); // Opcional: maximizar a janela ao iniciar
            options.AddArgument("--disable-gpu");
			options.AddArgument("--disable-software-rasterizer");
			options.AddArgument("--disable-accelerated-video");
			options.AddArgument("--disable-accelerated-2d-canvas");
			options.AddArgument("--disable-accelerated-compositing");
			options.AddArgument("--disable-accelerated-layers");
			options.AddArgument("--disable-accelerated-fixed-root-background");
			options.AddArgument("--disable-accelerated-mjpeg-decode");
			options.AddArgument("--disable-accelerated-video-decode");
            
            // Crie o driver do Chrome usando o serviço e as opções configuradas
            ChromeDriver driver = new ChromeDriver(service, options);
            
// Executa o código de teste
scriptWebBase.Test(driver, resourceExchange);

return new TestResult(TestStatusEnum.Success, this.Id, this.GetType().Name, "Script Web executado com sucesso.");
  }
  catch (Exception exception)
  {
return new TestResult(TestStatusEnum.Failed, this.Id, this.GetType().Name, exception.Message);
  }
  finally
  {
scriptWebBase.AfterTest(scriptWebBase.Driver);
  }
}

public class PostmanParams
{
  public string chromeDriverPath { get; set; }
}
  }

  public class SeleniumWebDriver : ScriptWebBase
  {
/// <summary>
/// Método executado antes do teste
/// </summary>
/// <param name="browser">Tipo de Browser a ser usado</param>
/// <param name="url">Url</param>
public override void BeforeTest(out Browser browser, out string url)
{
  browser = Browser.Chrome;
  url = "http://localhost:8000/";
}

/// <summary>
/// Método de teste, todo o script de teste deve ser colocado dentro deste método
/// </summary>
/// <param name="driver">Driver</param>
public override void Test(IWebDriver driver, IEnumerable<IResourceExchange> resourceExchange)
{
    INSIRA SEU CÓDIGO AQUI
}

/// <summary>
/// Método executado depois da execução do teste
/// </summary>
/// <param name="driver">Driver</param>
public override void AfterTest(IWebDriver driver)
{
  base.Quit();
}
  }
 }