Как да направите модулно тестване в Microsoft Dynamics AX 2012 в проект от реалния свят

Dynamics AX 2012 идва с поддръжка за тестване на единици.

За да има смислени тестове, трябва да се предоставят някои тестови данни (съхранени в таблици в базата данни).

За да получим възпроизводим резултат от единичните тестове, трябва да имаме едни и същи данни, съхранявани в таблиците всеки път, когато тестовете се изпълняват. Сега въпросът е как можем да постигнем това?

Научих, че има възможност за задаване на нивото на изолация за TestSuite на SysTestSuiteCompanyIsolateClass. Това ще създаде празна компания и ще изтрие компанията след провеждане на тестовете. В метода setup() мога да попълня моите тестови данни в таблиците с изрази за вмъкване. Това работи добре за малки сценарии, но става много тромаво, ако имате реален проект.

Чудех се дали има някой с практическо решение как да използвам X++ Unit Test Framework в сценарий от реалния свят. Всеки принос е много ценен.


person elToro    schedule 10.09.2015    source източник
comment
Въпреки че съм много заинтересован от вашия въпрос, обхватът е доста широк. Би било полезно, ако можете да предоставите конкретен пример, когато сте срещнали проблеми при написването на модулния тест.   -  person FH-Inway    schedule 10.09.2015
comment
В момента няма конкретен проблем, просто започвам с AX и се чудех как да се справя с темата за последователни тестови данни, водещи до възпроизводими резултати от тестване. Следователно вашият отговор по-долу беше много полезен.   -  person elToro    schedule 10.09.2015


Отговори (4)


Съгласен съм, че създаването на тестови данни в нова и празна компания работи само за сравнително тривиални сценарии или сценарии, при които сами сте внедрили цялата структура на данните. Но веднага щом са необходими съществуващи структури от данни, този подход може да отнеме много време.

Един подход, който работеше добре за мен в миналото, е да изпълнявам модулни тестове в съществуваща компания, която вече разполага с повечето конфигурационни данни (напр. финансова настройка, настройка на инвентара, ...), необходими за провеждане на теста. Самият тест се изпълнява в блок ttsBegin - ttsAbort, така че единичният тест всъщност не създава никакви данни.

Друг подход е да се приложат методи на доставчик на данни, които са тестови агностици, но създават данни, които често се използват в единични тестове (напр. метод, който създава продукт). Отнема известно време, за да се създаде полезен набор от методи за доставчик на данни, но след като те съществуват, писането на модулни тестове става много по-бързо. Вижте SysTest част V.: Изпълнение на теста (резултати, участници и слушатели) за това как Microsoft използва подобен подход (или поне през 2007 г. за AX 4.0).

И двата подхода могат също да се комбинират, бихте извикали методите на доставчика на данни вътре в блока ttsBegin - ttsAbort, за да създадете необходимите данни само за единичния тест.

Друг полезен метод е да използвате doInsert или doUpdate за създаване на вашите тестови данни, особено ако се интересувате само от няколко полета и не е необходимо да създавате напълно валиден запис.

person FH-Inway    schedule 10.09.2015
comment
Няма начин да изпращате съобщения на потребителите на SO, но обмисляли ли сте някога да се присъедините към програмата на Microsoft MVP и/или вече сте член? - person Alex Kwitny; 19.10.2016
comment
@AlexKwitny: Изпратих ви имейл до адреса на daxcent.com. - person FH-Inway; 19.10.2016

Мисля, че рамката за единичен тест беше последваща мисъл. За да го използва наистина, Microsoft би трябвало да предостави модулни тестови класове, след което, когато персонализирате техния код, вие също персонализирате техните модулни тестове.

Така че без това вие по същество оставате да кодирате единични тестове, които се опитват да обхванат основния код заедно с вашите модификации, което е огромна задача.

Мисля, че всъщност можете да го използвате около изолирани персонализации, които изпълняват някаква функция и не са силно изградени върху основен код. А също и с персонализации, които са интеграции с външни системи.

person Alex Kwitny    schedule 10.09.2015
comment
+1 за огромната задача за писане на модулни тестове за базов код. Microsoft признава този факт, но досега не е искал да пусне нито един от своите модулни тестове. Дискусиите в SysTestQuickStart и Използване на рамката за тестване на единици SysTest в Dynamics AX – защо да си правите труда? избройте някои причини за това. - person FH-Inway; 11.09.2015
comment
Предполагам, че не искат да публикуват своите модулни тестове, защото не искат да бъдат силно критикувани. AX се развива органично от години, така че предполагам, че модулните тестове ще ме натъжат. - person Alex Kwitny; 11.09.2015

Е, от моя гледна точка няма да можете да използвате повече от това, което посочихте от стандартната рамка. Това, което можете да направите, е повече около управлението на изданията. Можете да настроите интеграционна среда с целевите данни и да поставите своя модел за нощно изграждане в тази среда в края на процеса на изграждане и след това да изпълните вашите тестове. Да, ще са необходими повече усилия, за да го настроите и поддържате, но това е единственото решение, което съм виждал досега, за да има голям и последователен набор от данни, върху които да се изпълняват единици или интеграционни тестове.

person Geoffrey DELMEE    schedule 10.09.2015
comment
И аз си мислех в тази насока. Правилно ли приемам, че с интеграционна среда имате предвид тестова среда? Така че говорим за непрекъсната доставка и автоматизиране на процеса на изграждане и внедряване. Бихте ли ме насочили в правилната посока кои инструменти да използвам за постигане на този вид автоматизация. Мерси. - person elToro; 10.09.2015
comment
comment
За интеграционна среда, да, това е тестова среда. Наричам го както е, защото е за интеграционни тестове, а не за потребителски тестове. Можете също така да разгледате тази връзка: blogs.msdn.com/b/axsa/archive/2012/10/22/ Ще намерите препратки към бяла книга на TFS и примери за скриптове за изграждане на MS в PowerShell за стартиране на компилация. Създадох свои собствени скриптове, като следвам същите стъпки в партидния файл, тъй като не владея PowerShell :) След това можете да се свържете със скриптове за внедряване, за да ги доставите директно в целевата среда. - person Geoffrey DELMEE; 10.09.2015
comment
Благодаря на FH-Inway и Джефри ДЕЛМИ. Тези връзки са изключително полезни и ще ми помогнат да изградя автоматизиран непрекъснат процес на доставка. - person elToro; 11.09.2015

За да има смислени тестове, трябва да се предоставят някои тестови данни (съхранени в таблици в базата данни).

Както някой друг вече посочи - намерих за най-добре да използвам съществуваща компания за данни. В моя случай няколко съществуващи компании.

За да получим възпроизводим резултат от единичните тестове, трябва да имаме едни и същи данни, съхранявани в таблиците всеки път, когато тестовете се изпълняват. Сега въпросът е как можем да постигнем това?

Създадохме помощни средства за тестване, които ни помагат да "изпълним теста", автоматизирайки това, което би направил човек - ако сте проектирали приложението си така, че да може да се тества. По същество нашият тестов клас използва помощниците, за да изпълни теста, след което предоставя по-голямата част от стойността при валидирането на създадените от него данни.

Научих, че има възможност за задаване на нивото на изолация за TestSuite на SysTestSuiteCompanyIsolateClass. Това ще създаде празна компания и ще изтрие компанията след провеждане на тестовете. В метода setup() мога да попълня моите тестови данни в таблиците с изрази за вмъкване. Това работи добре за малки сценарии, но става много тромаво, ако имате реален проект.

Не намерих това за практично в нашата ситуация, така че не сме го използвали.

Чудех се дали има някой с практическо решение как да използвам X++ Unit Test Framework в сценарий от реалния свят. Всеки принос е много ценен.

Използвахме рамката за тестване, както е посочено по-горе, и тя работи за нас. ключът е да се намерят правилните сценарии за тестване, също така предоставя добра основа за писане на тествани класове.

person phoenixdaxguy    schedule 18.10.2016