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
- Bacharel em Sistemas de
Informação – UMC, Analista de Sistemas. NET/C# há mais de 4 anos,
desenvolvedor SalesForce na MakeItSimple. DATA CENTER TECHNICAL SPECIALIST
(DCTS), CERTIFIED LINUX ADMINISTRATOR
(CLA11), LPIC-1.
- Perfil no LinkedIn: http://br.linkedin.com/pub/rafael-soares-souza/43/609/107