Перенос на prod и тестовое покрытие.

Перенос на prod и тестовое покрытие.

Добрый день!

Классы переношу впервые - наверное, что-то я недоизучил...

Объясните, пожалуйста, логику процесса.
Мне нужно перенести созданный класс (AsyncReportController_Req) с dev на prod. На dev создал тестовый класс (AsyncReportController_Req_Test), система показывает покрытие 78%.
При переносе с помощью Change Set одного основного класса, deploy говорит о недостаточном покрытии. При попытке перенести сначала тестовый класс или их вместе - ошибка в деплое.

Component Errors

API Name Type Line Column Error Message
0 0 AsyncReportController_Req_Test.t(), Details: System.NoDataFoundException: The data you’re trying to access is unavailable. (System Code) Class.AsyncReportController_Req.runReport: line 82, column 1 Class.AsyncReportController_Req_Test.t: line 8, column 1

0 0 , Details: Average test coverage across all Apex Classes and Triggers is 47%, at least 75% test coverage is required.

Где выход из круга?

Спасибо.

D608e9f2a292e11d133a2d7405faab32?size=200&d=https%3a%2f%2fsalesforce developer.ru%2fwp content%2fuploads%2favatars%2fno avatar

Прошу прощения, разместил не в той ветке. Если есть возможность - перенесите в разработку.

Спасибо.

D608e9f2a292e11d133a2d7405faab32?size=200&d=https%3a%2f%2fsalesforce developer.ru%2fwp content%2fuploads%2favatars%2fno avatar

Ничего страшного, пусть будет в этой ветке

Переносятся код и тесты для кода вместе.
Если что-то не сработало значит разбирайся с ошибкой. Наверное не все в changeSet включил.

Вот посмотри здесь описание своей ошибки "NoDataFoundException"

https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_classes_exception_methods.htm

Посмотри что у тебя в этой строчке
Class.AsyncReportController_Req.runReport: line 82

Дмитрий, большое спасибо!
Проблему локализовал, но не решил.
В этой строчке обращение к источнику данных по reportId
Reports.ReportDescribeResult describe = Reports.ReportManager.describeReport(reportId);

При этом источник определен следующим образом:
static final Id reportId = '00O25000000L30K';

Сам отчет деплоил на Прод отдельно, и он там оказался, естественно, с другим ID

Можно ли подставить правильный ID на DEV и потом сделать upload changeSet?
Или это вообще дурной стиль? И как тогда делать правильно?

D608e9f2a292e11d133a2d7405faab32?size=200&d=https%3a%2f%2fsalesforce developer.ru%2fwp content%2fuploads%2favatars%2fno avatar

Hal
И как тогда делать правильно?

Не хардкодить, а сделать выборку по DeveloperName
А вообще самое правильное - читать, много читать и много учиться!

Да, вообще хардкодить ID ни в коем случае нельзя. Делай запросы к базе по имени. Смотри предыдущий коммент.

Может я все же нубский совет дам по покрытию, но если у твоего класса покрытие 78%, это не значит что в целом на проде с твоим классом покрытиие будет 78%.

Максим, человек только начал в теме разбираться, а ты ему такие узкие нюансы подкидываешь.
А с другой стороны, с математической - если на проде нет ошибок и суммарное покрытие больше 75% и ты добавляешь класс с покрытием 78% то как там может стать меньше 75%?

Dmitry Shnyrev
Максим, человек только начал в теме разбираться, а ты ему такие узкие нюансы подкидываешь.
А с другой стороны, с математической - если на проде нет ошибок и суммарное покрытие больше 75% и ты добавляешь класс с покрытием 78% то как там может стать меньше 75%?

Очень просто, тест не правильно написан и работает немного по другому. И все тестовое покрытие падает.

Значит надо использовать фаталити :D:D:D:D:D:D

http://i.imgur.com/rKglssW.png

wilder
чень просто, тест не правильно написан и работает немного по другому. И все тестовое покрытие падает.

Ну это понятно. Если тест написан неправильно, то и покрытие его будем меньше 75% а следовательно потянет за собой и суммарное покрытие на проде. Но тесты так не пишутся, чтобы работать по разному на дев и проде. Это уже косяк, который надо лечить.

Dmitry Shnyrev
А с другой стороны, с математической - если на проде нет ошибок и суммарное покрытие больше 75% и ты добавляешь класс с покрытием 78% то как там может стать меньше 75%?

Все же случаи,когда на проде 75% и ты заливаешь класс с 78%, а на выходе получалось 64% у меня были)

redzinko
Значит надо использовать фаталити :D:D:D:D:D:D

http://i.imgur.com/rKglssW.png

И вот этим вы показали, что не знаете как работает тестовое покрытие. Поздравляю.

wilder
И вот этим вы показали, что не знаете как работает тестовое покрытие. Поздравляю.

+1

А где доходчиво и с примерами можно прочитать как правильно писать тесты?

D608e9f2a292e11d133a2d7405faab32?size=200&d=https%3a%2f%2fsalesforce developer.ru%2fwp content%2fuploads%2favatars%2fno avatar

Эт не мое, случайно увидел на одном сэндбоксе, был поражен и решил оставить себе на память.

ЗЫ. В этом классе, кстати больше 7к таких строк.

redzinko
Эт не мое, случайно увидел на одном сэндбоксе, был поражен и решил оставить себе на память. ;)

Ну тогда вы легко сможете объяснить в чем сакральная ошибка этого кода. Не способа тестирования, а именно кода.

Hal
А где доходчиво и с примерами можно прочитать как правильно писать тесты?

Это огромная тема "Как правильно писать тесты"!!!
По этому вопросу целые книги выпускают.
А если надо начать с технической стороны вопроса относительно Salesforce
то можно начать с этого
https://developer.salesforce.com/page/An_Introduction_to_Apex_Code_Test_Methods
https://developer.salesforce.com/page/How_to_Write_Good_Unit_Tests
можно посмотреть вот это видео если есть лишних 2 часа
Hands-on Training: Write Apex Tests Using Best Practices

Вот еще интересное видео с теорией
Tests and Testability: Apex Structure and Strategy

redzinko
Эт не мое, случайно увидел на одном сэндбоксе, был поражен и решил оставить себе на память.

ЗЫ. В этом классе, кстати больше 7к таких строк.


Первый пакет, с которым я работал, имел для каждого класса такой метод, только не ++i;, а a++;

Для каждого класса, Карл!
PS: a++; я кстати потом убирал, оставляя только по одному в каждой строчке).

Maxim Elets
PS: a++; я кстати потом убирал, оставляя только по одному в каждой строчке).

И это правильно !

wilder
И это правильно !

да, одна a++ на строку это само собой разумеется.
А вот что еще смутило - все a++ находятся в отдельном классе. Как вы собираетесь поднимать покрытие отдельного класса, если a++ находятся в другом классе?

так главное, чтобы общее покрытие было больше 75) а в каком классе нафигачить мульен строк с а++ это дело вторичное

да и вообще, лучше таким не заниматься

Ну так если у тебя 100 классов с покрытием 74%, один такой класс даже если в нем будет 100% не даст покрытие больше 75%.
Ведь весь смысл этих a++ - это добавить их в КОНКРЕТНЫЙ класс чтобы поднять его покрытие с 74% до >75%. А не просто чтобы у тебя валялся отдельный класс с 100% покрытием.

так покрытие смотрится по количеству покрытых строк, а в каком классе они покрываются, помоему, без разницы.
получается 10 классов с суммарным количеством строк 10 000,и один класс с а++ на 100 000 000(к примеру) строк, то суммарное покрытие будет нормальным таким

а вот для триггеров обязательно должно быть минимум 1% покрытия при деплое на прод, но помоему добиться этого много ума не надо)

Maxim Elets
так покрытие смотрится по количеству покрытых строк, а в каком классе они покрываются, помоему, без разницы.

Я уже засомневался в своих представлениях. Я почему-то думал что берется среднее по классам покрытие. Хотя суммарное покрытие строк звучит логичнее и тогда отдельный класс с 100500 покрытыми строками имеет смысл.

Dmitry Shnyrev
++ на 1

Неа, именно общее поличество покрытых, не покрытых строк делить на общее число классов.

Maxim Elets
а вот для триггеров обязательно должно быть минимум 1% покрытия при деплое на прод, но помоему добиться этого много ума не надо)

Особенно если использовать триггер паттерн, тогда триггер правращается в одну строчку.

Господа, мне, как новичку в SF, конечно, отрадно слышать, что есть такой классный метод обхода высокой науки написания тестов. Это, по крайней мере, дает мне возможность хоть что-то попробовать в реальной работе, до того, как я эту науку освою Придется смирять свой перфекционизм.
А скажите, в реальной жизни на реальных проектах все пишут эти тесты аккуратно, или чаще по-нашему, по-бразильски?

D608e9f2a292e11d133a2d7405faab32?size=200&d=https%3a%2f%2fsalesforce developer.ru%2fwp content%2fuploads%2favatars%2fno avatar

Dmitry Shnyrev
Ну так если у тебя 100 классов с покрытием 74%, один такой класс даже если в нем будет 100% не даст покрытие больше 75%.
Ведь весь смысл этих a++ - это добавить их в КОНКРЕТНЫЙ класс чтобы поднять его покрытие с 74% до >75%. А не просто чтобы у тебя валялся отдельный класс с 100% покрытием.

Дима, ты не правильно понимаешь алгоритм покрытия

Hal
А скажите, в реальной жизни на реальных проектах все пишут эти тесты аккуратно, или чаще по-нашему, по-бразильски?

Ответь мне на вопрос: а зачем ты пишешь тесты?

Gres
Дима, ты не правильно понимаешь алгоритм покрытия

Да уже понял

Hal
А скажите, в реальной жизни на реальных проектах все пишут эти тесты аккуратно, или чаще по-нашему, по-бразильски?

Конечно все пишут аккуратно. Во-первых это бизнес, деньги и все такое - тут как своем проекте на php не получится делать. Во-вторых, это поможет тебе самому контролировать свой код. Если что сломаешь, лучше пусть тесты первыми скажут что у тебя что-то плохо, чем любимые клиенты.

Ответь мне на вопрос: а зачем ты пишешь тесты?[/quote]

Я всю жизнь работал на стороне Заказчика и это типичная картина - внутренняя разработка пишется по правилам (стараются по крайней мере), а со стороны Исполнителя дед-лайны делают свое черное дело, получаешь продукт с костылями.

D608e9f2a292e11d133a2d7405faab32?size=200&d=https%3a%2f%2fsalesforce developer.ru%2fwp content%2fuploads%2favatars%2fno avatar

Дедлайны должны учитывать и тесты и риски.
Но я тебя понимаю - не каждый заказчик понимает что это такое и почему надо тратить деньги на то что ему лично не нужно (те же тесты). Сам с этим постоянно сталкиваюсь.

У американских заказчиков могут встречаться требования к тестовому покрытию и качеству тестов. Есть пример где было затребовано 90% и тесты по best practice. При чём код в проде разворачивают специалисты со стороны заказчика.

Tellen
У американских заказчиков могут встречаться требования к тестовому покрытию и качеству тестов. Есть пример где было затребовано 90% и тесты по best practice. При чём код в проде разворачивают специалисты со стороны заказчика.

Это еще фигня в банке затребовали 95%. Потом правда откатили до 90%.

Tellen
У американских заказчиков могут встречаться требования к тестовому покрытию и качеству тестов. Есть пример где было затребовано 90% и тесты по best practice. При чём код в проде разворачивают специалисты со стороны заказчика.

Все правильно, так и надо делать!

Interesting information? Help us, post link to social media..