Как юнит-тест работает в Salesforce? - PullRequest
3 голосов
/ 07 декабря 2010

Я написал код для Salesforce, и чтобы выпустить модульные тесты, нужно охватить как минимум 75% .

С чем я сталкиваюсь, так это то, что classOne, который вызывает методы из classTwo, также должен покрывать classTwo модульный тест в пределах classOne , даже если это уже сделано в файле classTwo. .

Файл MyClassTwo

 public with sharing class ClassTwo {

    public String method1() {
        return 'one';
    }

    public String method2() {
        return 'two';
    }

    public static testMethod void testMethod1() {

        ClassTwo two = new ClassTwo();
        String out = two.method1();
        system.assertEquals(out, 'one'); //valid    
    }

    public static testMethod void testMethod2() {
        ClassTwo two = new ClassTwo();
        String out = two.method2();
        system.assertEquals(out, 'two'); // valid
    }

}

Файл MyClassOne

 public with sharing class ClassOne {

    public String callClassTwo() {
        ClassTwo foo = new ClassTwo();
        String something = foo.method1();

        return something;
    }

    public static testMethod void testCallClassTwo() {
        ClassOne one = new ClassOne();
        String out = one.callClassTwo();

        system.assertEquals(out, 'one');
    }
}

Результат тестирования MyClassOne не будет возвращать 100% покрытия теста, поскольку в нем говорится, что я не покрывал часть MyClassTwo method2 () внутри файла MyClassOne.

Но я уже написал модульный тест для MyClassTwo внутри файла MyClassTwo, как вы можете видеть.

Значит ли это, что мне нужно скопировать и вставить модульный тест из файла MyClassTwo в MyClassOne?

Это дает мне 100% охват, но это кажется действительно раздражающим и смешным. Имея такой же тест в ClassA и ClassB ....? Я поступаю неправильно или это так?

Сказав, возможно ли создать фиктивный объект в Salesforce? Пока не понимаю, как ...

http://sites.force.com/answers/ideaView?c=09a30000000D9xt&id=087300000007m3fAAA&returnUrl=/apex/ideaList%3Fc%3D09a30000000D9xt%26category%3DApex%2B%2526%2BVisualforce%26p%3D19%26sort%3Dpopular

UDPATE

Я переписал код и обновил выше, на этот раз наверняка тест classOne не вернет 100%, даже если он не вызывает метод classTwo2 ()

Ответы [ 3 ]

3 голосов
/ 08 декабря 2010

Комментарии о библиотеках-макетах Java не очень помогают в мире Salesforce;) В моих проектах мы обычно стремились создать собственные тестовые данные в тестовом методе, вызвать реальную функциональность, проверить результаты ... и всю инфраструктуру тестирования наСторона Salesforce отвечает за откат транзакции (поэтому тестовые данные не сохраняются в БД в конце независимо от того, был ли тест пройден неудачно или пройден).

В любом случае ...

Масато, ваши классы этого не делаюткомпилировать (методы за пределами класса, public String hello() без каких-либо возвращаемых строк) ... После того, как я исправил это, я просто щелкнул правой кнопкой мыши MyClassA -> Force.com ->, чтобы выполнить тесты, и получил полное покрытие кода без каких-либо проблем, поэтому ваша проблемалежите где-то еще ...

Вот как это выглядит: http://dl.dropbox.com/u/709568/stackoverflow/masato_code_coverage.png

Я пытаюсь понять, что могло пойти не так ... Вы уверены, что все классы компилируются и были сохранены насерверная сторона?Вы помещали тестовые методы в те же классы, что и в функциональности, или в отдельные (обычно я делаю отдельное имя класса с похожим именем, например MyClassATest).Если это отдельный класс - в каком файле вы нажали «выполнить тесты»?И последнее, но не менее важное: если вы столкнулись с этой проблемой во время развертывания из песочницы в производство, убедитесь, что вы выбрали все классы, которые вам нужны, в мастере развертывания?

1 голос
/ 13 апреля 2011

Я создал класс Apex под названием TestHelper для всех моих фиктивных объектов. Я использую константы (static final) для значений, которые мне могут понадобиться в других местах, и открытые статические поля для объектов. Прекрасно работает, и поскольку методы не используются, тестовое покрытие не требуется.

public without sharing class TestHelper {
public static final string testPRODUCTNAME = 'test Product Name';
public static final string testCOMPANYID = '2508'; 

public static Account testAccount {
    get{
        Account tAccount = new Account(
            Name = 'Test Account',
            BillingStreet = '123 Main St',
            BillingCity = 'Dallas',
            BillingState = 'TX',
            BillingPostalCode = '75234',
            Website = 'http://www.google.com',
            Phone = '222 345 4567',                
            Subscription_Start_Date__c = system.today(),
            Subscription_End_Date__c = system.today().addDays(30),
            Number_Of_Seats__c = 1,
            companyId__c = testCOMPANYID,
            ZProduct_Name__c = testPRODUCTNAME);      
        insert tAccount;
        return tAccount; 
    }
}

}

1 голос
/ 07 декабря 2010

Если вы действительно хотите «модульный» тест, вы должны проверить поведение вашего класса B И поведение вашего класса A, высмеивая вызов метода класса B.

Это тяжелый разговор между любителями издевательств и другими (Мартин Фаулер, я думаю, не "насмешник").

Так или иначе. Вы должны перестать думать о 100% покрытии. Вы должны подумать о:

  • Почему я тестирую?

  • Как я тестирую?

Здесь я бы определенно пошел на 2 теста:

  • Один тест для класса B в файл теста класса b, чтобы убедиться, что метод B хорошо реализован со всеми побочными эффектами, побочными значениями и т. Д.

  • один тест для насмешливого класса A класса B

Что такое макет?

Чтобы остаться ОЧЕНЬ простым: макет - это часть кода в вашем тесте, которая скажет: когда вызывается метод класса B, всегда возвращайте это значение: "+++".

Делая это, вы позволяете себе иметь стандартный и модулируемый набор тестов.

В Java я люблю mockito: http://mockito.org/

Хотя один из моих коллег является ведущим специалистом по easymock: http://easymock.org/

Надеюсь, это поможет. Спросите меня, нужна ли вам дополнительная помощь.

РЕДАКТИРОВАТЬ НЕКОТОРЫЙ ПРИМЕР

С Java и mockito:

public class aUTest {

    protected A a;

    @Mock protected B b;

    @Before
    public void setUp(){
        MockitoAnnotations.initMocks(this);
        a = new A();
        ReflectionTestUtils.setField(a, "b", b);
    }

        @Test
    public void test_A_method_should_not_throw_exception()
            when(b. execute()).thenReturn(true); //just an example of a return value from b. execute()
            Boolean result = a.testHello();

        // Assert
        Assert.assertEquals(true, result);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...