Início Facebook Twitter Vá para nosso Site Início Dicas Tutoriais Fale Conosco Image Map

Técnicas de Teste salesforce.com - Parte II

Já mostramos aqui no Blog como realizar, de diferentes formas, testes no salesforce.com e como criar uma classe de teste. Hoje vamos abordar um pouco mais esse tema, mostrando algumas formas mais avançadas de realizar os testes utilizando as seguintes técnicas:

- Static Resources;
- Testar uma página VisualForce.

Essas duas técnicas irão norteá-los melhor para elevar suas classes e triggers dentro do salesforce.com.

Primeiro vamos entender melhor o que é um Static Resources, antes de sairmos criando as classes de testes dentro do salesforce.com. O Static Resources (Recursos Estáticos) serve para adicionarmos algum arquivo CSS, JS, Java, Excel, Word e afins dentro de uma Organização (Aplicação salesforce.com). A partir desse recurso podemos invocar esse arquivo dentro de uma página VisualForce ou até mesmo dentro de um objeto utilizando uma programação. Para acessar esse recurso, dentro da ferramenta, utilize os passos abaixo:

1. Clique em seu nome (canto superior direito da tela) -> Configuração
2. No menu esquerdo selecione a opção Desenvolver -> Selecione a opção Recursos Estáticos.

Nessa parte do sistema podemos realizar o upload de um arquivo qualquer para utilizar dentro da Organização em algum momento oportuno.

Para referenciar seu arquivo dentro de uma página VisualForce utilize a notação abaixo (para imagens podemos utilizar da seguinte forma):

<apex:image url="{!$Resource.TestImage}" width="50" height="50"/>

Em TestImage (nome dado ao arquivo quando realizou o upload dentro do salesforce.com)  podemos especificar um  arquivo utilizando a função URLFOR(), com a seguinte notação:

<apex:image url="{!URLFOR($Resource.TestZip,
                  'images/Bluehills.jpg')}" width="50" height="50"/>

Para referenciar um JS podemos utilizar a sintaxe a seguir:

<apex:includeScript value="{!$Resource.MyJavascriptFile}"/>

Após entender como funciona o Statics Resources, vamos criar uma classe de testes utilizando esse recurso.

Primeiro crie um arquivo CSV para subir no recurso estático. Segue exemplo de teste com arquivo no formato abaixo:

NAME,Price__c,Quantity__c
Super Laptop,1299.00,170

Este arquivo também corresponde ao objeto que se deve inserir, atualizar ou deletar no salesforce.com. Sendo assim, crie a classe a seguir:

@isTest
public class WarehousePullTest {
static public Boolean createBaselineData() {
        Merchandise__c m = new Merchandise__c(Name='Rack Server',Price__c=1245.99,Quantity__c=500);
        insert m;
Invoice__c i = new Invoice__c();
        insert i;
Line_Item__c li = new Line_Item__c(Name='1',Quantity__c=10,Merchandise__c=m.Id,Invoice__c=i.Id);
        insert li;
return true;    
    }  
  @isTest
  public static void testPullData() {
WarehousePullData.createBaselineData();
List<Merchandise__c> merchandise = Test.loadData(Merchandise__c.sObjectType, 'MerchData');
        update merchandise;
Test.startTest();
Test.setMock(HttpCalloutMock.class, new WarehouseMock());
 WarehousePullData.pullData();
 Test.stopTest();
 List<Merchandise__c> merch = [SELECT ID from Merchandise__c WHERE Name = 'Laptop From Endpoint'];
System.assertEquals(merch.size(),1);
    }
}

Em nossa classe de testes estamos aplicando uma forma interessante de utilizar uma base de dados de testes, que é a criação de um método que consiga inserir os registros esperados. A partir desses registros iremos executar nossos testes e o nome do método que realiza esse processo é createBaselineData().

Para carregar nossa base de dados, a partir de um CSV, utilizaremos a seguinte sintaxe:

 List<Merchandise__c> merchandise = Test.loadData(Merchandise__c.sObjectType, 'MerchData');

“MerchData” é o nome que foi dado ao Statics Resource adicionado na Organização, informamos que carregaremos esses dados dentro do objeto Merchandise__c e que ele é um sObjectType. O método nos retorna uma lista do mesmo tipo do objeto que estamos carregando, após esse carregamento atualizamos a lista que automaticamente atualiza a nossa base de referência:

        update merchandise;

A classe de teste validará a classe a seguir:

public with sharing class WarehousePullData { 
          public WarehousePullData() {}
          public static String pullData() {                           
                              Http h = new Http();
                              HttpRequest req = new HttpRequest();
req.setEndpoint('http://warehousedatapush.herokuapp.com/');
                              req.setMethod('GET');
                              HttpResponse res = h.send(req);
                              Map<String, Object> data = (Map<String, Object>)JSON.deserializeUntyped(res.getBody());  
List<Object> items = (List<Object>)data.get('Items');
                                         List<Merchandise__c> new_items = new List<Merchandise__c>();
                                         for(Object item : items) {
                                                        Map<String, Object> item_data = (Map<String, Object>)item;
                                                        Merchandise__c merch = new Merchandise__c();
                                                        merch.Name = (String)item_data.get('Name');
                                                        merch.Quantity__c = (Decimal)item_data.get('Quantity');
                                                        merch.Price__c = (Decimal)item_data.get('Price');
                                                        new_items.add(merch);
                                         }                             
                                         insert new_items;
                                         return 'Done';
          }
}

Agora vamos verificar como testar uma página VisualForce. Essa parte é muito simples, segue dentro da sua classe de testes que valida um “Controller” do VisualForce. Para isso adicione a sintaxe abaixo:

Pagereference testePage = Page.PaginaAcao;                                                                          
testePage.getParameters().put('id', '30');                    
testePage.getParameters().put('data', '05/08/2013');
Test.setCurrentPage(testePage);
Test.StartTest();
ClasseController controller = new ClasseController ();
controller.getLista();
controller.MontarCabecalho();
Test.StopTest();

Primeiramente criaremos uma referência de página utilizando a sintaxe abaixo:

        Pagereference testePage=Page.PaginaAcao;

Em Page.PaginaAcao coloque o nome de sua página em VisualForce. Se em seu controller espera receber um parâmetro via querystring iremos criar esse parâmetro dentro do nosso teste utilizando a seguinte sintaxe:

       testePage.getParameters().put('id', '30');

Após configurar os parâmetros que seu controller irá receber, informamos qual será a página de teste na hora de executar a classe:

      Test.setCurrentPage(testePage);

Após configurarmos a página onde serão realizados os testes, iniciamos e criamos nosso controller, que faz parte da página VisualForce.

ClasseController controller = new ClasseController ();

A partir dessa instância disparamos os métodos do controller, caso tenha algum método que carregue uma lista ou um dropdownlist basta chamá-lo:

controller.getLista();

E chamar o método que espera receber um pagereference:

controller.MontarCabecalho();

Terminado os testes finalize a execução com o test.StopTest().

Esperamos que o artigo ajude e abra um pouco mais a mente de vocês para criação de testes.

Pulo do gato
Lembre-se que o salesforce.com irá criar os Id’s dinamicamente e se precisar realizar algum vinculo será importante primeiro carregar a base Pai e depois carregar a base filha vinculando os Id’s entre elas.
Caso opte em utilizar a forma com um método carregando os registros no seu teste vincule os Id’s ao término dos inserts pais.

Escrito por: Rafael Soares Souza