Escrevendo testes

Os testes PHPUnit estão relacionados a uma unidade que você está testando. O caminho dos testes é idêntico ao caminho da unidade dentro da pasta de testes /…. Cada classe de teste de unidade tem um sufixo… Teste e deve estender a classe SuiteCRM \ Test \ SuitePHPUnitFrameworkTestCase. O prefixo dos métodos de teste é test….

Por exemplo. se o /path/to/Example.php contém uma classe Example, o teste relacionado deve estar em tests / path / to / ExampleTest.php:

 

Exemplo para um teste PHPUnit
conteúdo de testes / caminho / para / ExampleTest.php:
use SuiteCRM\Test\SuitePHPUnitFrameworkTestCase;
// note: SuitePHPUnitFrameworkTestCase extends SuiteCRM\TestCaseAbstract, which extends PHPUnit_Framework_TestCase. class ExampleTest extends SuitePHPUnitFrameworkTestCase { public function testDoingSomething() { $example = new Example(); $results = $example->doSomething(); $this->assertSame(‘expected value’, $results); } }

Veja mais sobre os testes PHPUnit em https://phpunit.readthedocs.io

 

Aulas de teste:
– classe abstrata SuiteCRM \ TestCaseAbstract
Implementação de um caso de teste abstrato, essa classe substitui os métodos setUp () e tearDown () para lidar com a criação e reversão da transação do banco de dados.

 

Testes de segurança de estado
Anteriormente, tínhamos ajudantes StateSaver e StateChecker para tornar mais fácil escrever testes seguros de estado. Isso se provou lento e complexo, então nós o substituímos por um sistema mais padrão envolvendo transações de banco de dados que são revertidas após cada teste de unidade individual.
– Mantenha o estado do ambiente global do sistema limpo, especialmente em testes.
– Se um teste deixar alguns dados extras no banco de dados, sistema de arquivos, superglobais, etc., isso pode alterar o comportamento dos outros testes executados posteriormente. Ao escrever um novo teste, certifique-se de que é seguro para o estado, o que significa que os testes não devem deixar nenhum dado “lixo” no estado do ambiente de teste.
– Para garantir que o estado permaneça inalterado quando um teste de unidade é executado, existem algumas coisas que você deve ter em mente:
– Estado do banco de dados, isso é tratado automaticamente pelo sistema de reversão da transação do banco de dados. No entanto, se você criar explicitamente uma transação de banco de dados em seu teste, precisará certificar-se de que o teste usa a estratégia de limpeza de truncamento em vez da estratégia de transação padrão.
– Mudanças em arquivos no sistema de arquivos, atualmente não fazemos isso.
– Nível de erro, se o seu teste depende de um nível de erro específico, você deve salvar o nível de relatório de erro que existe no início do teste, alterar o nível de erro e restaurá-lo no final do teste.
– Variáveis ​​globais do PHP, elas podem ser manipuladas pelo próprio PHPUnit, embora atualmente não usemos essa funcionalidade.
– Mudanças no PHP INI, elas precisam ser tratadas manualmente da mesma forma que os níveis de erro

 

Um exemplo de restauração do nível de relatório de erro em um teste:

<?php

use SuiteCRM\Test\SuitePHPUnitFrameworkTestCase;

class somethingTest extends SuitePHPUnitFrameworkTestCase {
public function testSomething() {
// Store the current error level and then set the reporting level to 0 for the test.
$errorLevelStored = error_reporting();
error_reporting(0);

 

    // Do test stuff

    // Restore error reporting level.
    error_reporting($errorLevelStored);
}

 

Como: Testar Imap
Desenvolvedores capazes de escrever teste IMAP (testes de unidade e de aceitação).

Se o modo de desenvolvedor definido e o nível de logger forem depurados, a classe ImapHandler registra cada chamada de imap, então cada chamada de método de imap registrada com o parâmetro chamado e os valores de retorno para que os desenvolvedores e testadores possam ver exatamente o que está acontecendo em segundo plano. Se imap_test definido, o sistema usa chamadas falsas por parâmetros de método predefinidos e valores de retorno em ImapHandlerFakeCalls.php para que os desenvolvedores possam adicionar mais testes para qualquer funcionalidade de e-mail, mesmo que precise de um recurso imap válido.

– ImapHandler: classe Wrapper para funções de extensão integrada de PHP IMAP.
– ImapHandlerFacotry: recupera um ImapHandlerInterface. Pode ser ImapHandler ou ImapHandlerFake. Use $ sugar_config [‘imap_test’] = true em config_override.php para ativar o modo de teste.
– ImapHandlerFake: classe Wrapper para funções de extensão integrada de PHP IMAP. (apenas testes)
– ImapHandlerFakeCalls.php: descreve os valores de retorno de funções imap falsas para cada chamada de função com parâmetros específicos em cada cenário de teste.
– ImapHandlerFakeData: Apenas para testes, ele lida com valores de retorno falsos para chamadas falsas em um wrapper IMAP.
– ImapHandlerInterface: Wrappers IMAP precisam implementar para que o sistema possa usá-lo como um manipulador IMAP.
– ImapTestSettingsEntry.php: para um ponto de entrada para definir o cenário de teste atual em qualquer teste de aceitação pode chamá-lo. (exemplo de ponto de entrada: index.php? entryPoint = setImapTestSettings & imap_test_settings = [índice da matriz em ImapHandlerFakeCalls.php])

 

Exemplo de uso em testes de unidade:
primeiro precisa incluir os seguintes arquivos:
include_once DIR . ‘/../../../../../include/Imap/ImapHandlerFakeData.php’;
include_once DIR . ‘/../../../../../include/Imap/ImapHandlerFake.php’;

 

Exemplo de teste de unidade para conexão imap (usando dados imap falsos)

public function testConnectMailserverUseSsl()
 {

     // using fake imap handler behaviour in test
     $fake = new ImapHandlerFakeData();

     // set up the fake handler behaviour
     $fake->add('isAvailable', null, [true]);
     $fake->add('setTimeout', [1, 60], [true]);
     $fake->add('setTimeout', [2, 60], [true]);
     $fake->add('setTimeout', [3, 60], [true]);
     $fake->add('getErrors', null, [false]);
     $fake->add('getConnection', null, [function () {
         // the current crm code needs a valid resource to an imap server
         // but also will accept a file resource
         return fopen('fakeImapResource', 'w+');
     }]);
     $fake->add('getMailboxes', ['{:/service=/notls/novalidate-cert/secure}', '*'], [[]]);
     $fake->add('ping', null, [true]);
     $fake->add('reopen', ['{:/service=}', 32768, 0], [true]);

     // instantiate a fake imap handler
     $imap = new ImapHandlerFake($fake);

     $_REQUEST['ssl'] = 1;

     // using fake imap in InboundEmail class (only for testing)
     $ie = new InboundEmail($imap);

     // test connection, it should pass
     $ret = $ie->connectMailserver();
     $this->assertEquals('true', $ret);
 }

 

variáveis ​​de configuração úteis:
$sugar_config[‘imap_test’] = true;
$sugar_config[‘logger’][‘level’] = ‘debug’;
$sugar_config[‘stack_trace_errors’] = false; // set to true for more details
$sugar_config[‘developerMode’] = true;
$sugar_config[‘show_log_trace’] = false; // set to true for more details