Оберон-клуб «ВЄДАsoft»

Твердыня модульных языков
Текущее время: 19 июн 2021, 09:17

Часовой пояс: UTC + 2 часа




Начать новую тему Ответить на тему  [ 1 сообщение ] 
Автор Сообщение
 Заголовок сообщения: модульное тестирование
СообщениеДобавлено: 27 дек 2018, 02:13 
Не в сети

Сообщения: 350
Официальная версия данного инструмент будет жить в https://gitlab.com/budden/nkp, здесь не буду обновлять. Чтобы заработало, нужно открыть Kernel.trapViewer на чтение.
Код: "OBERON"
  1.  
  2. MODULE Запусктестов;
  3.  
  4. IMPORT
  5. Kernel, Strings, Fonts, Ports, Stores, Models, Views, Controllers, Properties, Dialog, Controls,
  6. TextModels, TextSetters, TextMappers, Services, StdLog, SYSTEM;
  7.  
  8. VAR
  9. текущийТест-: PROCEDURE;
  10. имяТекущегоТеста-: POINTER TO ARRAY OF CHAR;
  11. выполненоТестов-: INTEGER;
  12. успехТекущегоТеста-: BOOLEAN;
  13. былоИсключениеВТекущемТестеЛи-: BOOLEAN;
  14. кодИсключенияВТекущемТесте-: INTEGER;
  15. ошибокВСессии-: INTEGER;
  16. показыватьВходВТестЛи*: BOOLEAN;
  17. названиеСессии-: ARRAY 4096 OF CHAR;
  18.  
  19. PROCEDURE дваЦелыхЧислаВСтрокуЧерезДробь*(ч1, ч2: LONGINT; VAR Рез: ARRAY OF CHAR);
  20. VAR одноЧисло: ARRAY 32 OF CHAR;
  21. BEGIN
  22. Strings.IntToString(ч1,Рез);
  23. Strings.IntToString(ч2, одноЧисло);
  24. Рез := Рез + "/" + одноЧисло END дваЦелыхЧислаВСтрокуЧерезДробь;
  25.  
  26. PROCEDURE НачниСессиюТестирования*(IN названиеСессииБудет: ARRAY OF CHAR);
  27. BEGIN
  28. названиеСессии := "" + названиеСессииБудет;
  29. StdLog.String("Запуск сессии тестирования " + названиеСессии);
  30. StdLog.Ln;
  31. выполненоТестов := 0;
  32. ошибокВСессии := 0; END НачниСессиюТестирования;
  33.  
  34. PROCEDURE ЗавершиСессиюТестирования*;
  35. BEGIN
  36. StdLog.String("Конец сессии тестирования " + названиеСессии); StdLog.Ln;
  37. StdLog.String("Ошибок/Тестов: ");
  38. StdLog.Int(ошибокВСессии); StdLog.String("/");
  39. StdLog.Int(выполненоТестов);
  40. StdLog.Ln; END ЗавершиСессиюТестирования;
  41.  
  42. PROCEDURE ЗаметьЭтоИсключение;
  43. BEGIN
  44. былоИсключениеВТекущемТестеЛи := TRUE;
  45. кодИсключенияВТекущемТесте := Kernel.err END ЗаметьЭтоИсключение;
  46.  
  47. PROCEDURE УзнайИмяПроцедуры*(з:PROCEDURE):POINTER TO ARRAY OF CHAR;
  48. (* По мотивам StdDebug.ShowStack *)
  49. VAR ref, end, a: INTEGER; mod: Kernel.Module;
  50. modName, name: Kernel.Name;
  51. res: INTEGER; nn: Kernel.Utf8Name;
  52. Результат : POINTER TO ARRAY OF CHAR;
  53. длинаРезультата : INTEGER;
  54. BEGIN
  55. длинаРезультата := 1 (* символ конца строки *);
  56. a := SYSTEM.VAL(INTEGER,з);
  57. mod := Kernel.modList;
  58. WHILE (mod # NIL) & ((a < mod.code) OR (a >= mod.code + mod.csize)) DO mod := mod.next END;
  59. IF mod # NIL THEN
  60. DEC(a, mod.code);
  61. IF mod.refcnt >= 0 THEN
  62. Kernel.GetModName(mod, modName);
  63. INC(длинаРезультата,LEN(modName$));
  64. ref := mod.refs;
  65. REPEAT Kernel.GetRefProc(ref, end, nn) UNTIL (end = 0) OR (a < end);
  66. IF a < end THEN
  67. Strings.Utf8ToString(nn, name, res);
  68. INC(длинаРезультата, 1 (* точка *) + LEN(name$));
  69. NEW(Результат, длинаРезультата);
  70. Результат^ := modName + "." + name;
  71. RETURN Результат END END END;
  72. NEW(Результат, длинаРезультата);
  73. Результат^ := "";
  74. RETURN Результат END УзнайИмяПроцедуры;
  75.  
  76. PROCEDURE ВызовиТекущийТест(ненужно1,ненужно2,ненужно3:INTEGER);
  77. BEGIN текущийТест() END ВызовиТекущийТест;
  78.  
  79. PROCEDURE подготовьсяКТестированию(тест: PROCEDURE);
  80. BEGIN
  81. текущийТест := тест;
  82. имяТекущегоТеста := УзнайИмяПроцедуры(текущийТест);
  83. успехТекущегоТеста := TRUE;
  84. былоИсключениеВТекущемТестеЛи := FALSE END подготовьсяКТестированию;
  85.  
  86. PROCEDURE обработайПровалТеста(IN сбщ: ARRAY OF CHAR);
  87. BEGIN
  88. INC(ошибокВСессии);
  89. StdLog.String("!"+имяТекущегоТеста+" - провал теста"+сбщ);
  90. StdLog.Ln END обработайПровалТеста;
  91.  
  92. PROCEDURE обработайРезультатыТеста(должноБытьИсключениеЛи: BOOLEAN; кодИсключенияДолженБыть: INTEGER);
  93. VAR сбщ: ARRAY 4096 OF CHAR; стр : ARRAY 64 OF CHAR;
  94. BEGIN
  95. INC(выполненоТестов);
  96. IF должноБытьИсключениеЛи THEN
  97. IF ~ былоИсключениеВТекущемТестеЛи THEN
  98. обработайПровалТеста(": ожидалось исключение");
  99. ELSIF кодИсключенияВТекущемТесте # кодИсключенияДолженБыть THEN
  100. сбщ := ": ожидался/получен код исключения: ";
  101. дваЦелыхЧислаВСтрокуЧерезДробь(
  102. кодИсключенияДолженБыть, кодИсключенияВТекущемТесте, стр );
  103. сбщ := сбщ + стр;
  104. обработайПровалТеста(сбщ) END
  105. ELSIF былоИсключениеВТекущемТестеЛи THEN
  106. Strings.IntToString( кодИсключенияВТекущемТесте, стр);
  107. сбщ := ": неожиданное исключение с кодом "+стр;
  108. обработайПровалТеста(сбщ)
  109. ELSIF ~ успехТекущегоТеста THEN
  110. обработайПровалТеста("") END END обработайРезультатыТеста;
  111.  
  112. (*** Запуск тестов *)
  113.  
  114. (** зт == запусти тест *)
  115. PROCEDURE зтВнутр (тест: PROCEDURE
  116. ; должноБытьИсключениеЛи: BOOLEAN
  117. ; кодИсключенияДолженБыть: INTEGER);
  118. VAR сохранённыйПросмотровщикЛовушки: PROCEDURE;
  119. BEGIN
  120. подготовьсяКТестированию(тест);
  121. IF показыватьВходВТестЛи THEN
  122. StdLog.String("зт*: " + имяТекущегоТеста); StdLog.Ln END;
  123. (* Здесь понадобилось открыть Kernel.trapViewer *)
  124. сохранённыйПросмотровщикЛовушки := Kernel.trapViewer;
  125. Kernel.InstallTrapViewer(ЗаметьЭтоИсключение);
  126. Kernel.Try(ВызовиТекущийТест,0,0,0);
  127. Kernel.InstallTrapViewer(сохранённыйПросмотровщикЛовушки);
  128. обработайРезультатыТеста(должноБытьИсключениеЛи, кодИсключенияДолженБыть) END зтВнутр;
  129.  
  130. (** зт == запусти тест *)
  131. PROCEDURE зт*(тест: PROCEDURE);
  132. BEGIN зтВнутр(тест,FALSE,0) END зт;
  133.  
  134. (* зтои == запусти тест, ожидается исключение *)
  135. PROCEDURE зтои*(тест: PROCEDURE; кодИсключенияДолженБыть: INTEGER);
  136. BEGIN зтВнутр(тест,TRUE,кодИсключенияДолженБыть) END зтои;
  137.  
  138. (*** Проверки, которые вставляются внутрь теста *)
  139.  
  140. (* пп = провал проверки *)
  141. PROCEDURE пп*;
  142. BEGIN успехТекущегоТеста := FALSE END пп;
  143.  
  144. (* ппсс = провал проверки, с сообщением *)
  145. PROCEDURE ппсс*(IN сбщ : ARRAY OF CHAR);
  146. BEGIN
  147. IF сбщ # "" THEN
  148. StdLog.String(" "+имяТекущегоТеста+": провал проверки: "+сбщ);
  149. StdLog.Ln END;
  150. успехТекущегоТеста := FALSE END ппсс;
  151.  
  152. (* дб = должно быть *)
  153. PROCEDURE дб*( проверяемоеУсловие : BOOLEAN);
  154. BEGIN
  155. IF ~ проверяемоеУсловие THEN успехТекущегоТеста := FALSE END END дб;
  156.  
  157. (* дбсс == должно быть, с сообщением *)
  158. PROCEDURE дбсс*( проверяемоеУсловие: BOOLEAN; IN сбщ:ARRAY OF CHAR );
  159. BEGIN
  160. IF ~ проверяемоеУсловие THEN
  161. ппсс(сбщ) END END дбсс;
  162.  
  163. (* дбцсс == должно быть (ожидаемое) целое число, с сообщением *)
  164. PROCEDURE дбцсс*( ожидаемоеЧисло, полученноеЧисло: LONGINT; IN сбщ: ARRAY OF CHAR );
  165. VAR стр : ARRAY 64 OF CHAR; сбщ2 : ARRAY 4096 OF CHAR;
  166. BEGIN
  167. сбщ2 := "" + сбщ;
  168. IF ожидаемоеЧисло # полученноеЧисло THEN
  169. IF сбщ # "" THEN
  170. дваЦелыхЧислаВСтрокуЧерезДробь( ожидаемоеЧисло, полученноеЧисло, стр);
  171. сбщ2 := сбщ2 + стр END;
  172. ппсс(сбщ2) END END дбцсс;
  173.  
  174. (*** Демо *)
  175.  
  176. PROCEDURE ДемоНеудачныйТест;
  177. BEGIN ппсс("почему-то не вышло") END ДемоНеудачныйТест;
  178.  
  179. PROCEDURE ДемоНеудачныйТест2;
  180. BEGIN дбцсс(1,0,"") END ДемоНеудачныйТест2;
  181.  
  182. PROCEDURE ДемоНеудачныйТест3;
  183. BEGIN дб(FALSE) END ДемоНеудачныйТест3;
  184.  
  185. PROCEDURE ДемоУдачныйТест;
  186. BEGIN дбцсс(1,1,"") END ДемоУдачныйТест;
  187.  
  188. PROCEDURE Рухни*;
  189. VAR Ложжь: BOOLEAN;
  190. BEGIN Ложжь := FALSE; ASSERT(Ложжь,20) END Рухни;
  191.  
  192. PROCEDURE Демо*;
  193. BEGIN
  194. показыватьВходВТестЛи := FALSE;
  195. НачниСессиюТестирования("Демо-сессия");
  196. зт(ДемоНеудачныйТест);
  197. зт(ДемоНеудачныйТест2);
  198. зт(ДемоНеудачныйТест3);
  199. зт(ДемоУдачныйТест);
  200. зтои(Рухни,20);
  201. зт(Рухни);
  202. ЗавершиСессиюТестирования;
  203. END Демо;
  204.  
  205. END Запусктестов.
  206.  
  207. ^q "Запусктестов.Демо"
  208.  


Вернуться к началу
 Профиль  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ 1 сообщение ] 

Часовой пояс: UTC + 2 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
© VEDAsoft Oberon Club