czwartek, 7 lutego 2019

[1] Google Test - Testowanie tablic

Ten krótki post chciałbym poświęcić na opisanie sposobu testowania tablic w projekcie Embedded.


Sposób przeprowadzenia testu:


Podczas przygotowywania ramek z danymi, które będą przesyłane np. za pomocą UART'a zachodzi konieczność sprawdzenia czy wszystkie dane są w odpowiednich miejscach i w odpowiedniej postaci.

Poniżej przedstawię tylko prostą testową procedurę, bez funkcji testowej.

  1. #define _START_FRAME        0x01
  2. #define _COMMAND_CODE       0x56
  3. #define EXAMPLE_ARRAY_LENGTH 0x07
  4. uint8_t testFuntrion(uint8_t *ptrToArray, uint8_t arraySize, uint8_t param1, uint8_t param2)
  5. {
  6.     /*
  7.     *   Prepare array
  8.     */
  9.     return 0; //If parameters OK
  10. }
  11. TEST(ExampleArrayTest, prepResponseArray_ProperArray)
  12. {
  13.     uint8_t testArray[EXAMPLE_ARRAY_LENGTH] = { 0x00 };
  14.     uint8_t functionTestReturnValue = 1;    //By Default set to error
  15.     const uint8_t param1 = 5;
  16.     const uint8_t param2 = 10;
  17.     const uint8_t param1_ModifyRefValue = (param1 * 3) - 28;
  18.     const uint8_t param2_ModifyRefValue = ((param2 * 5) - 3)/23;
  19.     const uint8_t functionReturnValueExpexted = 0;
  20.     const uint8_t referenceArray_HardCoded[EXAMPLE_ARRAY_LENGTH] = { _START_FRAME,
  21.                                                                 EXAMPLE_ARRAY_LENGTH,
  22.                                                                 _COMMAND_CODE,
  23.                                                                 param1,
  24.                                                                 param2,
  25.                                                                 param1_ModifyRefValue,
  26.                                                                 param2_ModifyRefValue };
  27.     const uint8_t numberOfElementsToCheck = ((sizeof(referenceArray_HardCoded) / sizeof(referenceArray_HardCoded[0])));
  28.     functionTestReturnValue = testFuntrion(&testArray[0],
  29.                                             (sizeof(testArray)/sizeof(testArray[0])),
  30.                                             param1,
  31.                                             param2);
  32.     ASSERT_EQ(functionReturnValueExpexted, functionTestReturnValue);
  33.     ASSERT_THAT(std::vector<uint8_t>(referenceArray_HardCoded
  34.                         ,referenceArray_HardCoded + numberOfElementsToCheck)
  35.                         ,::testing::ElementsAreArray(testArray));
  36. }

Dodatkowym atutem przy takim sprawdzaniu danych jest wyświetlenie informacji na których miejscach następuje rozbieżność w zadanych parametrach. Informacja z błędem będzie dotyczyła pierwszego parametru, który nie zgadza się z zadanym.


W przypadku pozytywnego rezultatu dostaniemy informację o powodzeniu testu:


Drugi sposób pozwalający na uzyskanie wiadomości z informacją błędnego elementu może wyglądać następująco:

  1. for (uint8_t i = 0; i < numberOfElementsToCheck; i++)
  2. {
  3.     ASSERT_EQ(referenceBuffer[i], bufferToCheck[i])
  4.             << "***********************\n"
  5.             << "Error in element number: " << unsigned(i)
  6.             << "\nActual Value is: " << unsigned(bufferToCheck[i])
  7.             << "\nExpected Value is: " << unsigned(referenceBuffer[i]);
  8. }

Tutaj wykonałem zwykłą pętlę for przechodzącą przez wszystkie elementy. W przypadku wystąpienia błędu pojawi się dokładna informacja który element jest zły oraz jego aktualne wartości.

Funkcję można wykorzystać do samego przygotowywania ramek, tak aby upewnić się, że przygotowaliśmy poprawne dane do przesłania, sprawdzanie zdekodowanych danych, przygotowywanie ramki z odpowiedzią, gdzie dodatkowo wykonuje się operację na podanych parametrach itp.