wtorek, 25 lipca 2023

STM32H7 - Unit test - Unity

W tym poście chciałbym krótki opisać sposób implementacji testów Unity w układzie STM32H7. Do testów wykorzystam płytkę Nucleo z układem STM32H723ZG. Projekt został wygenerowany przez program CubeMx. 


Na samym początku pobieramy pliki źródłowe (link: Unity - Throw The Switch). 

Następnie dokładamy do projektu potrzebne pliku źródłowe:

  • unity.h
  • unity_internals.h
  • unity.c

Domyślnie funkcje Unity wykorzystują funkcję putchar do przesłania danych na wyjście. Aby wyjście danych działało poprawnie należy przekierować wyjście na jeden z uartów:

  1. int _write(int file, char *ptr, int len)
  2. {
  3.   int DataIdx = 0;
  4.  
  5.   for (DataIdx = 0; DataIdx < len; DataIdx++)
  6.   {
  7.       HAL_UART_Transmit(&huart2, (uint8_t *)ptr++, 1, HAL_MAX_DELAY);
  8.   }
  9.   return len;
  10. }

Po tej operacji, można uruchomić testy:

  1. #ifdef UNITY_TEST_RUN
  2. UnityBegin("test/example_test.c");
  3. RUN_TEST(addFuntion_Test_CheckIfProperResponse);
  4. return (UnityEnd());
  5. #endif
  6. /* USER CODE END 2 */

Takich prostych testów wynik będzie następujący:

  1. setUpStart
  2.  
  3. setUpTearDown
  4. test/example_test.c:126:addFuntion_Test_CheckIfProperResponse:PASS
  5.  
  6. -----------------------
  7. 1 Tests 0 Failures 0 Ignored
  8. OK

Dostępne makra testowe zostały zdefiniowane w pliku unity.h. Jest ich dosyć sporo, poniżej wypiszę tylko kilka z dostępnych testów:

  • TEST_ASSERT, TEST_ASSERT_TRUE - sprawdza czy podany warunek testowy jest wartością true. 
  • TEST_ASSERT_FALSE, TEST_ASSERT_UNLESS - sprawdza czy podany warunek testowy jest wartością true.
  • TEST_ASSERT_EQUAL_INT, TEST_ASSERT_EQUAL_UINT8 itp. - porównywanie wartości danego typu. 
  • TEST_ASSERT_BITS, TEST_ASSERT_BITS_HIGH itp. - porównywanie bitów w danej zmiennej.
  • TEST_ASSERT_GREATER_THEN, TEST_ASSERT_GREATER_UINT16 itp. - sprawdzanie czy dana wartość jest większa od podanej.
  • TEST_ASSERT_LESS_THEN, TEST_ASSERT_LESS_UINT16 itp. - sprawdzanie czy dana wartość jest mniejsza od podanej.
  • TEST_ASSERT_GREATER_OR_EQUAL, TEST_ASSERT_GREATER_OR_EQUAL_UINT16 itp. - sprawdzanie czy dana wartość jest większa lub równa wartości zadanej.

Tego rodzaju testy warto wykorzystywać, gdy do testowania oprócz samej logiki mamy do sprawdzenia jeszcze jakieś elementy sprzętowe. Pozwoli to na zweryfikowanie np. odczytu danych z pamięci FLASH, EEPROM, komunikacji z czujnikami itp. itd. Dzięki temu będzie wiadomo czy część sprzętowa została poprawnie przygotowana lub w fazie produkcji do wykonania testów weryfikujących czy dana sztuka produktu została wykonana poprawnie i wszystkie połączenia z elementami aktywnymi działają poprawnie.