#Testes

0 Seguidores · 19 Postagens

Teste de software é uma investigação conduzida para fornecer aos interessados informações sobre a qualidade do produto ou serviço de software em teste.

Artigo Heloisa Paiva · Set. 12, 2025 3m read

Uma coisa que aprendi ao longo dos anos é que, não importa o quão aprimorada seja a lógica do seu aplicativo, o desempenho do banco de dados acabará por determinar o sucesso ou fracasso da experiência do usuário. Trabalhando com o InterSystems IRIS, recentemente vivenciei isso em primeira mão. Um de nossos clientes estava construindo um painel de relatórios que funcionava perfeitamente durante os testes, mas assim que o conjunto de dados de produção cresceu para milhões, os tempos de resposta ficaram extremamente lentos.

0
0 47
Anúncio Danusa Calixto · Ago. 8, 2025

Usuários do framework %UnitTest agora podem obter informações de cobertura de teste dentro do VS Code combinando a versão mais recente (v2.0.0) da extensão InterSystems Testing Manager com a impressionante Test Coverage Tool de @Timothy.Leavitt.

Acima, você pode ver o painel Cobertura de Teste, que movi para a barra lateral secundária à direita para que possa ser explorado mais facilmente em conjunto com o Explorador de Testes à esquerda.

0
0 31
Artigo Andre Larsen Barbosa · Jul. 30, 2025 3m read

É... Chegou a hora dos testes. Sabemos que em muitas vezes, ela até já passou. Bom, e agora? Consigo reforçar a qualidade do meu desenvolvimento?

A resposta é: SIM. Sim, você consegue. A ferramenta Toolqa busca exatamente isto. É um facilitador. Qual é o seu objetivo? Garantir que as APIS atendam aos requisitos de negócio pré-estabelecidos, e também mantenha-se rígida com as <sarcasm> futuras tentativas frustradas </sarcasm> de acabar com a sua aplicação, site, App ou qualquer outro que utilize-se de sua API.

Agora deve estar se perguntando, mas como é que isto acontece? Onde está a mágica?

0
0 24
Artigo Larissa Prussak · Jul. 24, 2025 1m read

Você está curioso para saber como executar scripts Python diretamente no terminal do InterSystems IRIS ou Caché? 🤔
Boa notícia: é fácil! 😆
O IRIS oferece suporte ao Embedded Python, permitindo que você use Python de forma interativa dentro do terminal do IRIS.

Como acessar o Shell do Python?

Para iniciar o shell do Python a partir do terminal do IRIS, basta executar o seguinte comando:

do##class(%SYS.Python).Shell()

Esse comando abre um shell interativo do Python dentro do terminal do IRIS. A partir daí, você pode escrever e executar código Python como faria em um ambiente Python normal.

0
0 25
Artigo Heloisa Paiva · jan 14, 2025 1m read

Olá! Eu expandi meu repositório de demonstração, andreas5588/demo-dbs-iris,para facilitar o teste dos recursosFOREIGN SERVERFOREIGN TABLE no IRIS.

Para alcançar isso, criei um namespace chamado FEDERATION. A ideia é a seguinte:

  1. Configurar conexões JDBC para cada namespace.
  2. Criar um FOREIGN SERVER dentro do namespace FEDERATION para cada conexão.
  3. Definir umaFOREIGN TABLE pelo menos para uma tabela com base em cada servidor externo.

O Script:  demo-dbs-iris/src/sql/02_create_foreign_server.sql

0
0 32
InterSystems Oficial Danusa Calixto · Out. 10, 2024

Recentemente, disponibilizamos uma nova versão do InterSystems IRIS no Vector Search Early Access Program, apresentando um novo índice Approximate Nearest Neighbor baseado no algoritmo de indexação Hierarchical Navigable Small World (HNSW). Essa adição permite pesquisas altamente eficientes e aproximadas de vizinhos mais próximos em grandes conjuntos de dados vetoriais, melhorando drasticamente o desempenho e a escalabilidade da consulta.

0
0 54
Anúncio Danusa Calixto · Mar. 20, 2024

Olá Desenvolvedores,

Junte-se a nós na próxima Mesa Redonda de Desenvolvedores em 26 de Março às 12 horas (BR - SP)📍
Teremos 2 temas abordados pelos especialistas convidados e discussão aberta como sempre!

Palestras:

Demonstração sobre documentação e teste de chamadas REST gerando documentação e fazendo cenários para testes de integração - apresentado por @Danny Wijnschenk , Desenvolvedor de Aplicações, Winfo.
➡ Cypress para testes de aplicativos da web  - apresentado por @Pravin Barton , Desenvolvedor de Aplicações Senior, InterSystems

Registre-se através >> desafio Global Masters <<

 

0
0 79
Anúncio Danusa Calixto · Mar. 4, 2024

Olá Desenvolvedores, 

Nossa primeira Mesa Redonda da Comunidade de Desenvolvedores de 2024 irá acontecer no dia 5 de Março de 2024 às 11 horas (BR-SP).

Palestras sobre tecnologia:

  1. Ferramentas de Testes Unitários de ObjectScript, Técnicas e Melhores Práticas - por @Timothy Leavitt , Development Manager, Application Services, InterSystems
  2. Capacidades de Monitoramento e Alertas do InterSystems IRIS - por @Mark Bolinsky , Principal Technology Architect, InterSystems. A apresentação de Mark foi remarcada para a mesa redonda de abril.

>> RVSP no desafio do Global Masters <<
[se você ainda não é membro do Global Masters, é só logar usando a sua credencial SSO InterSystems e clique neste link novamente]

 

1
0 54
Artigo Danusa Calixto · Dez. 22, 2023 3m read

O Subsistema Windows para Linux (WSL) é um recurso do Windows que permite executar um ambiente do Linux na sua máquina do Windows, sem precisar de uma máquina virtual separada ou inicialização dupla. 

O WSL foi projetado para oferecer uma experiência perfeita e produtiva a desenvolvedores que querem usar ambos o Windows e o Linux ao mesmo tempo**.

O WSL 2 é o tipo de distro padrão ao instalar uma distribuição Linux. O WSL 2 usa tecnologia de virtualização para executar um kernel do Linux dentro de uma máquina virtual (VM) utilitária leve. As distribuições Linux são executadas como contêineres isolados dentro da VM gerenciada pelo WSL 2. As distribuições Linux executadas pelo WSL 2 compartilham o mesmo namespace de rede,  árvore de dispositivos (além de /dev/pts), CPU/kernel/memória/swap, binário /init, mas têm o próprio  namespace PID, namespace Montar, namespace de usuário, namespace Cgroup e processo de inicialização.

O WSL 2 melhora o desempenho do sistema de arquivos e adiciona a compatibilidade total de chamadas do sistema em comparação com a arquitetura do WSL 1.

O Docker é uma plataforma aberta para desenvolver, enviar e executar aplicativos. Ele permite que você separe seus aplicativos da sua infraestrutura, para entregar software rapidamente. Com o Docker, você pode gerenciar sua infraestrutura da mesma forma que gerencia seus aplicativos. Ao aproveitar as vantagens das metodologias do Docker para envio, teste e implantação de código, você pode reduzir significativamente o atraso entre a escrita do código e a execução na produção.****

Aqui, vamos aprender a migrar facilmente a imagem do Docker da Community Edition do IRIS para o WSL 2.

Exporte o tar de um contêiner

Abra a linha de comando (Bash) para uma distribuição Linux que você já instalou da Microsoft Store (CentOS Stream nesse exemplo, para Ubuntu os comandos são os mesmos, com exceção do uso de service em vez de systemctl).

Inicie o serviço do Docker:

sudo systemctl docker start

Faça o pull da imagem do DockerHub:

docker pull intersystems/iris-community:2023.3

Execute o contêiner IRIS dentro do Docker:

docker run intersystems/iris-community:2023.3

Pegue o ID do contêiner IRIS usando grep e awk (de uma guia diferente do WSL, de preferência):  

É opcional parar o contêiner do docker antes dessa etapa, no entanto, se você não fizer isso, só precisará parar/iniciar a instância após a importação para o WSL

dockerContainerID=$(docker container ls -a | grep -i iris | awk '{print $1}')

Exporte o ID do contêiner ID para um arquivo tar no seu c-drive montado:

docker export $dockerContainerID > /mnt/c/temp/iris_community.tar

 

Exemplo de importação da comunidade do IRIS

Abra o PowerShell e garanta que você tenha uma pasta criada onde quer armazenar a distribuição.

cd C:\temp
mkdir C:\Users\csepulvedamancilla\wslDistroStorage\IRIS

 

Use o comando wsl --import <DistroName> <InstallLocation> <InstallTarFile> para importar o arquivo tar.

 wsl --import IRISCommunity C:\Users\csepulvedamancilla\wslDistroStorage\IRIS .\iris.tar

Use o comando wsl -d IRISCommunity para executar sua distribuição Linux recém-importada.

 

 wsl -d IRISCommunity

Depois de conectado, inicialize o IRIS  (uma dica profissional, faça isso com wsl.conf!)

su - irisowner
iris start IRIS

 

Aproveite sua instância!

http://localhost:52773/csp/sys/%25CSP.Portal.Home.zen

 

Você já pode aproveitar todos os benefícios de desempenho, flexibilidade e integração nativa do WSL2 (ou seja, acesso direto aos arquivos, acompanhamento de logs, cópia de drivers Java e muito mais) ao usar sua instância da comunidade do IRIS.

** https://learn.microsoft.com/en-us/windows/wsl/about

*** https://learn.microsoft.com/en-us/windows/wsl/use-custom-distro

**** https://docs.docker.com/get-docker/

0
0 108
Anúncio Danusa Calixto · Maio 24, 2023

Se você já construiu testes unitários utilizando o %UnitTest framework, ou está pensando em usá-lo, por favor dê uma olhada no InterSystems Testing Manager. 

Agora você pode buscar os testes unitários sem sair do VS Code, executar ou depurá-los, e visualizar os resultados da execução anterior. 

0
0 88
Artigo Heloisa Paiva · Mar. 2, 2023 3m read

 Introdução

Esse é um tutorial simples da forma mais rápida que eu achei para criar uma base de dados de exemplo para quaisquer razões, como realizar testes, fazer exemplos para tutoriais, etc.

Criando um namespace

  1. Abra o terminal
  2. Escreva o comando "D $SYSTEM.SQL.Shell()"
  3. Escreva"CREATE DATABASE " e o nome desejado para o namespace.

Agora você tem um namespace novo de uma forma muito mais rápida que criando pelo Portal de Administração - que é claro que oferece muito mais opções de configuração.

0
0 146
Artigo Danusa Calixto · Fev. 23, 2023 3m read

Nesta série de artigos, quero apresentar e discutir várias abordagens possíveis para o desenvolvimento de software com tecnologias da InterSystems e do GitLab. Vou cobrir tópicos como:

  • Primeiro artigo
    • Conceitos básicos do Git, por que um entendimento de alto nível dos conceitos do Git é importante para o desenvolvimento de software moderno
    • Como o Git pode ser usado para desenvolver software (fluxos do Git)
  • Segundo artigo
    • Fluxo de trabalho do GitLab — um processo completo do ciclo de vida do software, desde a ideia até o feedback do usuário
    • Entrega Contínua — uma abordagem de engenharia de software em que as equipes produzem software em ciclos curtos, garantindo que o software possa ser lançado de forma confiável a qualquer momento. Seu objetivo é construir, testar e lançar software com mais rapidez e frequência
  • Terceiro artigo
    • Instalação e configuração do GitLab
    • Conexão dos seus ambientes ao GitLab
  • Quarto artigo
    • Configuração da entrega contínua
  • Quinto artigo
    • Contêineres e como (e por que) podem ser usados
  • Sexto artigo
    • Principais componentes para um pipeline de entrega contínua com contêineres
    • Como todos eles trabalham juntos
  • Sétimo artigo
    • Configuração da entrega contínua com contêineres
  • Oitavo artigo
    • Configuração da entrega contínua com o InterSystems Cloud Manager
  • Nono artigo
    • Arquitetura do contêiner
  • Décimo artigo
    • CI/CD para configuração e dados
  • Décimo primeiro artigo
    • Interoperabilidade e CI/CD

Nessa série de artigos, discuti abordagens gerais de entrega contínua. É um tema extremamente vasto e essa série de artigos precisa ser vista mais como uma coleção de receitas do que algo definitivo. Se você deseja automatizar o desenvolvimento, os testes e a entrega do seu aplicativo, a entrega contínua em geral e o GitLab em particular é o melhor caminho. A entrega contínua e os contêineres permitem que você personalize seu fluxo de trabalho conforme necessário.

0
0 175
Anúncio Henrique Dias · Fev. 12, 2023

Fala galera!

Prepare-se para revolucionar seu processo de teste com o iris-tripleSlash, a solução matadora para testes unitários.

Diga adeus aos testes unitários chatos e repetitivos e diga "Olá seu lindo" para os testes eficientes e sem muito esforço.

Com o iris-tripleSlash, você pode gerar casos de teste de unidade com facilidade usando o poder da documentação.

0
0 50
Artigo Henry Pereira · jan 7, 2021 13m read

Tempoestimado de leitura: 6 minutos
 

Olá a todos,

Fui apresentado ao TDD há quase 9 anos e imediatamente me apaixonei por ele. 
Hoje em dia se tornou muito popular, mas, infelizmente, vejo que muitas empresas não o utilizam. Além disso, muitos desenvolvedores nem sabem o que é exatamente ou como usá-lo, principalmente iniciantes.

Visão Geral

Meu objetivo com este artigo é mostrar como usar TDD com %UnitTest. Vou mostrar meu fluxo de trabalho e explicar como usar o cosFaker, um dos meus primeiros projetos, que criei usando o Caché e recentemente carreguei no OpenExchange.

Então, aperte o cinto e vamos lá.

O que é TDD?

O Desenvolvimento Guiado por Testes (TDD) pode ser definido como uma prática de programação que instrui os desenvolvedores a escrever um novo código apenas se um teste automatizado falhar.
Existem toneladas de artigos, palestras, apresentações, seja o que for, sobre suas vantagens e todas estão corretas.
Seu código já nasce testado, você garante que seu sistema realmente atenda aos requisitos definidos para ele, evitando o excesso de engenharia, e você tem um feedback constante.

Então, por que não usar o TDD? Qual é o problema com o TDD? A resposta é simples: o Custo! Isso custa muito!
Como você precisa escrever mais linhas de código com TDD, é um processo lento. Mas com o TDD você tem um custo final para criar um produto AGORA, sem ter que adicioná-lo no futuro.
Se você executar os testes o tempo todo, encontrará os erros antecipadamente, reduzindo assim o custo de sua correção.
Portanto, meu conselho: Simplesmente Faça!

Configuração

A InterSystems tem uma documentação e tutorial sobre como usar o  %UnitTest, que você pode ler aqui. 

Eu uso o vscode para desenvolver. Desta forma, crio uma pasta separada para testes. Eu adiciono o caminho para código do meu projeto ao UnitTestRoot e quando executo testes, passo o nome da subpasta de teste. E eu sempre passo no qualificador loadudl

Set ^UnitTestRoot = "~/code"

  Do ##class(%UnitTest.Manager).RunTest("myPack","/loadudl")

 

Passos

Provavelmente você já ouviu falar sobre o famoso ciclo TDD: vermelho ➡ verde ➡ refatorar. Você escreve um teste que falha, você escreve um código de produção simples para fazê-lo passar e refatora o código de produção.
Então, vamos sujar as mãos e criar uma classe para fazer cálculos matemáticos e outra para testá-la. A última classe deve estender de %UnitTest.TestCase.
Agora vamos criar um ClassMethod para retornar um quadrado de um número inteiro:



Class Production.Math

{


ClassMethod Square(pValue As %Integer) As %Integer

{

}


}

 

E teste o que acontecerá se passarmos 2. Deve retornar 4.

Class TDD.Math Extends %UnitTest.TestCase

{


Method TestSquare()

{

    Do $$$AssertEquals(##class(Production.Math).Square(2), 4)

}


}

 

Se você executar:

Do ##class(%UnitTest.Manager).RunTest("TDD","/loadudl")

o teste irá Falhar

Vermelho! O próximo passo é torná-lo Verde. 
Para fazer funcionar, vamos retornar 4 como resultado da execução do nosso método Square.

Class Production.Math

{


ClassMethod Square(pValue As %Integer) As %Integer

{

  Quit 4

}


}

e executar novamente nosso teste.

Provavelmente você não está muito satisfeito com esta solução, porque ela funciona para apenas um cenário. Ótimo! Vamos dar o próximo passo. Vamos criar outro cenário de teste, agora enviando um número negativo.

Class TDD.Math Extends %UnitTest.TestCase

{


Method TestSquare()

{

    Do $$$AssertEquals(##class(Production.Math).Square(2), 4)

}


Method TestSquareNegativeNumber()

{

    Do $$$AssertEquals(##class(Production.Math).Square(-3), 9)

}


}

Quando executamos o teste:

ele Falhará novamente, então vamos refatorar o código de produção:

Class Production.Math

{


ClassMethod Square(pValue As %Integer) As %Integer

{

  Quit pValue * pValue

}


}

e executar novamente nossos testes:

Agora tudo funciona bem... Esse é o ciclo do TDD, em pequenos passos.

Você deve estar se perguntando: por que devo seguir esses passos? Por que eu tenho que ver o teste falhar?
Trabalhei em equipes que escreveram o código de produção e só depois escrevi os testes. Mas eu prefiro seguir estes passos de bebê pelos seguintes motivos:
Tio Bob (Robert C. Martin) disse que escrever testes depois de escrever o código não é TDD e, em vez disso, é chamado de “perda de tempo”.
Outro detalhe, quando vejo o teste falhar, e depois vejo passar, estou testando o teste.
Seu teste também é um código; e pode conter erros também. E a maneira de testá-lo é garantir que ele falhe e seja aprovado quando for necessário. Desta forma, você "testou o teste". 

cosFaker

Para escrever bons testes, você pode precisar gerar dados de teste primeiro. Uma maneira de fazer isso é gerar um despejo (dump) de dados e usá-lo em seus testes.
Outra maneira é usar o cosFaker para gerar facilmente dados falsos quando você precisar deles. https://openexchange.intersystems.com/package/CosFaker

Basta fazer o download do arquivo xml, em seguida vá para o Portal de Gerenciamento -> System Explorer -> Classes -> Import. Selecione o arquivo xml a ser importado ou arraste o arquivo no Studio.
Você também pode importá-lo usando o Terminal

Do $system.OBJ.Load("yourpath/cosFaker.vX.X.X.xml","ck")

 

Localização

O cosFaker adicionará arquivos de localidades na pasta da aplicação CSP padrão. Por enquanto, existem apenas dois idiomas: Inglês e Português do Brasil (minha língua nativa). 
O idioma dos dados é escolhido de acordo com a configuração do seu Caché.
A localização do cosFaker é um processo contínuo, se você quiser ajudar, não hesite em criar um provedor localizado para sua própria localidade e enviar um Pull Request.
Com o cosFaker você pode gerar palavras aleatórias, parágrafos, números de telefone, nomes, endereços, e-mails, preços, nomes de produtos, datas, códigos de cores hexadecimais... etc.

Todos os métodos são agrupados por assunto nas classes, ou seja, para gerar uma Latitude você chama o método Latitude na classe Address 

 Write ##class(cosFaker.Address).Latitude()

-37.6806

Você também pode gerar Json para seus testes

Write ##class(cosFaker.JSON).GetDataJSONFromJSON("{ip:'ipv4',created_at:'date.backward 40',login:'username', text: 'words 3'}")

{
    "created_at":"2019-03-08",
    "ip":"95.226.124.187",
    "login":"john46",
    "text":"temporibus fugit deserunt"
}

 

Aqui está uma lista completa das classes e métodos do cosFaker:

  • cosFaker.Address
    • StreetSuffix
    • StreetPrefix
    • PostCode
    • StreetName
    • Latitude
      • Output: -54.7274
    • Longitude
      • Output: -43.9504
    • Capital( Location = “” )
    • State( FullName = 0 )
    • City( State = “” )
    • Country( Abrev = 0 )
    • SecondaryAddress
    • BuildingNumber
  • cosFaker.App
    • FunctionName( Group= “”, Separator = “” )
    • AppAction( Group= “” )
    • AppType
  • cosFaker.Coffee
    • BlendName
      • Output: Cascara Cake
    • Variety
      • Output: Mundo Novo
    • Notes
      • Output: crisp, slick, nutella, potato defect!, red apple
    • Origin
      • Output: Rulindo, Rwanda
  • cosFaker.Color
    • Hexadecimal
      • Output: #A50BD7
    • RGB
      • Output: 189,180,195
    • Name
  • cosFaker.Commerce
    • ProductName
    • Product
    • PromotionCode
    • Color
    • Department
    • Price( Min = 0, Max = 1000, Dec = 2, Symbol = “” )
      • Output: 556.88
    • CNPJ( Pretty = 1 )
      • CNPJ is the Brazilian National Registry of Legal Entities
      • Output: 44.383.315/0001-30
  • cosFaker.Company
    • Name
    • Profession
    • Industry
  • cosFaker.Dates
    • Forward( Days = 365, Format = 3 )
    • Backward( Days = 365, Format = 3 )
  • cosFaker.DragonBall
    • Character
      • Output: Gogeta
  • cosFaker.File
    • Extension
      • Output: txt
    • MimeType
      • Output: application/font-woff
    • Filename( Dir = “”, Name = “”, Ext = “”, DirectorySeparator = “/” )
      • Output: repellat.architecto.aut/aliquid.gif
  • cosFaker.Finance
    • Amount( Min = 0, Max = 10000, Dec = 2, Separator= “,”, Symbol = “” )
      • Output: 3949,18
    • CreditCard( Type = “” )
      • Output: 3476-581511-6349
    • BitcoinAddress( Min = 24, Max = 34 )
      • Output: 1WoR6fYvsE8gNXkBkeXvNqGECPUZ
  • cosFaker.Game
    • MortalKombat
      • Output: Raiden
    • StreetFighter
      • Output: Akuma
    • Card( Abrev = 0 )
      • Output: 5 of Diamonds
  • cosFaker.Internet
    • UserName( FirstName = “”, LastName = “” )
    • Email( FirstName = “”, LastName = “”, Provider = “” )
    • Protocol
      • Output: http
    • DomainWord
    • DomainName
    • Url
    • Avatar( Size = “” )
    • Slug( Words = “”, Glue = “” )
    • IPV4
      • Output: 226.7.213.228
    • IPV6
      • Output: 0532:0b70:35f6:00fd:041f:5655:74c8:83fe
    • MAC
      • Output: 73:B0:82:D0:BC:70
  • cosFaker.JSON
    • GetDataOBJFromJSON( Json = “” //  String de modelo JSON para criar dados )
      • Parameter Example: "{dates:'5 date'}"
      • Output: {"dates":["2019-02-19","2019-12-21","2018-07-02","2017-05-25","2016-08-14"]}
  • cosFaker.Job
    • Title
    • Field
    • Skills
  • cosFaker.Lorem
    • Word
    • Words( Num = “” )
    • Sentence( WordCount = “”, Min = 3, Max = 10 )
      • Output: Sapiente et accusamus reiciendis iure qui est.
    • Sentences( SentenceCount = “”, Separator = “” )
    • Paragraph( SentenceCount = “” )
    • Paragraphs( ParagraphCount = “”, Separator = “” )
    • Lines( LineCount = “” )
    • Text( Times = 1 )
    • Hipster( ParagraphCount = “”, Separator = “” )
  • cosFaker.Name
    • FirstName( Gender = “” )
    • LastName
    • FullName( Gender = “” )
    • Suffix
  • cosFaker.Person
    • cpf( Pretty = 1 )
      • CPF is the Brazilian Social Security Number
      • Output: 469.655.208-09
  • cosFaker.Phone
    • PhoneNumber( Area = 1 )
      • Output: (36) 9560-9757
    • CellPhone( Area = 1 )
      • Output: (77) 94497-9538
    • AreaCode
      • Output: 17
  • cosFaker.Pokemon
    • Pokemon( EvolvesFrom = “” )
      • Output: Kingdra
  • cosFaker.StarWars
    • Characters
      • Output: Darth Vader
    • Droids
      • Output: C-3PO
    • Planets
      • Output: Takodana
    • Quotes
      • Output: Only at the end do you realize the power of the Dark Side.
    • Species
      • Output: Hutt
    • Vehicles
      • Output: ATT Battle Tank
    • WookieWords
      • Output: nng
    • WookieSentence( SentenceCount = “” )
      • Output: ruh ga ru hnn-rowr mumwa ru ru mumwa.
  • cosFaker.UFC
    • Category
      • Output: Middleweight
    • Fighter( Category = “”, Country = “”, WithISOCountry = 0 )
      • Output: Dmitry Poberezhets
    • Featherweight( Country = “” )
      • Output: Yair Rodriguez
    • Middleweight( Country = “” )
      • Output: Elias Theodorou
    • Welterweight( Country = “” )
      • Output: Charlie Ward
    • Lightweight( Country = “” )
      • Output: Tae Hyun Bang
    • Bantamweight( Country = “” )
      • Output: Alejandro Pérez
    • Flyweight( Country = “” )
      • Output: Ben Nguyen
    • Heavyweight( Country = “” )
      • Output: Francis Ngannou
    • LightHeavyweight( Country = “” )
      • Output: Paul Craig
    • Nickname( Fighter = “” )
      • Output: Abacus

Vamos criar uma classe para o usuário com um método que retorna seu nome de usuário, que será FirstName concatenado com LastName.

Class Production.User Extends %RegisteredObject

{


Property FirstName As %String;


Property LastName As %String;


Method Username() As %String

{

}


}

 

Class TDD.User Extends %UnitTest.TestCase

{


Method TestUsername()

{

  Set firstName = ##class(cosFaker.Name).FirstName(),

    lastName = ##class(cosFaker.Name).LastName(),

    user = ##class(Production.User).%New(),

    user.FirstName = firstName,

    user.LastName = lastName


  Do $$$AssertEquals(user.Username(), firstName _ "." _ lastName)

}


}

Refatorando:

Class Production.User Extends %RegisteredObject

{


Property FirstName As %String;


Property LastName As %String;


Method Username() As %String

{

  Quit ..FirstName _ "." _ ..LastName

}


}

Agora vamos adicionar uma data de expiração da conta e validá-la.

Class Production.User Extends %RegisteredObject

{


Property FirstName As %String;


Property LastName As %String;


Property AccountExpires As %Date;


Method Username() As %String

{

  Quit ..FirstName _ "." _ ..LastName

}


Method Expired() As %Boolean

{

}


}




Class TDD.User Extends %UnitTest.TestCase

{


Method TestUsername()

{

  Set firstName = ##class(cosFaker.Name).FirstName(),

    lastName = ##class(cosFaker.Name).LastName(),

    user = ##class(Production.User).%New(),

    user.FirstName = firstName,

    user.LastName = lastName

    Do $$$AssertEquals(user.Username(), firstName _ "." _ lastName)

}


Method TestWhenIsNotExpired() As %Status

{

  Set user = ##class(Production.User).%New(),

    user.AccountExpires = ##class(cosFaker.Dates).Forward(40)

  Do $$$AssertNotTrue(user.Expired())

}


}

Refatorando:

Method Expired() As %Boolean

{

  Quit ($system.SQL.DATEDIFF("dd", ..AccountExpires, +$Horolog) > 0)

}

Agora vamos testar quando a conta expirou:

Method TestWhenIsExpired() As %Status

{

  Set user = ##class(Production.User).%New(),

    user.AccountExpires = ##class(cosFaker.Dates).Backward(40)

  Do $$$AssertTrue(user.Expired())

}

E tudo está verde...

Eu sei que esses são exemplos bobos, mas dessa forma você verá a simplicidade não apenas no código, mas também no design da classe.
 

Conclusão

Neste artigo, você aprendeu um pouco sobre Desenvolvimento Guiado por Testes e como usar a classe %UnitTest.
Também cobrimos o cosFaker e como gerar dados falsos para seus testes.

Há muito mais para aprender sobre testes e TDD, como usar essas práticas com código legado, testes de integração, testes de aceitação (ATDD), bdd, etc... 
Se você quiser saber mais sobre isso, recomendo fortemente 2 livros:
 

Test Driven Development Teste e design no mundo real com Ruby - Mauricio Aniche, realmente não sei se este livro tem versão em inglês. Existem edições para Java, C #, Ruby e PHP. Este livro me surpreendeu com sua grandiosidade.

E, claro, o livro de Kent Beck Test Driven Development by Example

Sinta-se à vontade para deixar comentários ou perguntas.
Isso é tudo, pessoal

1
0 517
Artigo Robert Cemper · Dez. 14, 2020 3m read
Este é um exemplo de codificação funcionando no IRIS 2020.1 e no Caché 2018.1.3 
Ele não será sincronizado com as novas versões      
E também NÃO é atendido pelo Suporte da InterSystems!   

Globais no Caché / Ensemble / IRIS são normalmente invisíveis ao acessar o SQL
Este exemplo mostra como contornar esse limite.

Globais são apresentadas como conteúdo de uma tabela, com seus subscritos, e o conteúdo armazenado.
A global a ser visualizada é passada ao SQL por uma condição estática WHERE que
requer 3 parâmetros:

  • o nome da global (obrigatório)
  • o subscrito inicial (opcional)
  • o subscrito de parada (opcional)

Apenas fornecer o nome da global resulta em um despejo (dump) da global completo.
As globais também podem ser fornecidas com a referência estendida e, como esta é uma tabela SQL, todos os tipos de condições adicionais se aplicam.

Tome cuidado. Colocar as aspas corretamente entre SQL e Caché / Ensemble / IRIS pode ser um desafio

Exemplo:
select * from zrcc_G.dump where zrcc_G.Dump('^|"CACHE"|Sample.PersonD',2,4)=1

ID         Global           Subscrito         Valor
1   ^|"CACHE"|Sample.PersonD    (2) $lb("",792533244,"GlobaDynamics Holdings Inc.",64256,"C1787","Y5365","A5","A658","R1770","","Ironhorse,Alice D.","T3710","O3","I4011","W8367","557-37-6758",83059958205089661,"1841-01-02 00:00:00")
2   ^|"CACHE"|Sample.PersonD    (3) $lb("",862705606,"TeleLateral Associates",34553,"V8155","T8918","X9","V8732","K1167","","Eisenstien,Peter E.","H208","C8","Q2015","Q3357","702-46-8467",57275722714358892,"2020-06-23 13:27:18")
3   ^|"CACHE"|Sample.PersonD    (4) $lb("",677194559,"RoboSoft Group Ltd.",52738,"F4851","Z364","S8","O6888","O4367","","Eagleman,Clint C.","C8051","R6","V1659","C9814","664-33-8809",-53705244349891319,"2020-06-23 13:27:18")

select TOP 15 * from zrcc_G.dump where zrcc_G.Dump('^%SYS','"JOURNAL"')=1

ID  Global         Subscrito             Valor
1   ^%SYS   ("JOURNAL")            0
2   ^%SYS   ("JOURNAL","ALTDIR")   "C:\InterSystems\IRIS\altjournal\"
3   ^%SYS   ("JOURNAL","CURDIR")   "C:\InterSystems\IRIS\mgr\journal\"
4   ^%SYS   ("JOURNAL","CURRENT")  "1^C:\InterSystems\IRIS\mgr\journal\20200801.009"
5   ^%SYS   ("JOURNAL","EXPSIZE")  0
6   ^%SYS   ("JOURNAL","LAST")     "1^C:\InterSystems\IRIS\mgr\journal\20200801.009"
7   ^%SYS   ("JOURNAL","LIFESPAN","FILE")   "2,2"
8   ^%SYS   ("JOURNAL","MAXSIZE")    1073741824
9   ^%SYS   ("JOURNAL","PREFIX")   ""
10  ^%SYS   ("JOURNAL","PURGED","c:\intersystems\iris\mgr\journal\20191104.001")    "2019-11-07 17:38:30"
11  ^%SYS   ("JOURNAL","PURGED","c:\intersystems\iris\mgr\journal\20191104.002")    "2019-11-07 17:38:30"
12  ^%SYS   ("JOURNAL","PURGED","c:\intersystems\iris\mgr\journal\20191104.003")    "2019-11-07 17:38:30"
13  ^%SYS   ("JOURNAL","PURGED","c:\intersystems\iris\mgr\journal\20191104.004")    "2019-11-07 17:38:30"
14  ^%SYS   ("JOURNAL","PURGED","c:\intersystems\iris\mgr\journal\20191104.005")    "2019-11-08 08:39:47"
15  ^%SYS   ("JOURNAL","PURGED","c:\intersystems\iris\mgr\journal\20191105.001")    "2019-11-08 08:39:47"
0
0 260