CppUtest w Keil uVision

Wpis zawiera kroki postępowania przy stworzeniu projektu ze scenariuszami testów jednostkowych dla firmware’u zapisanego w C++11.

Toolchain: uVision MDK-ARM Essential Version: V5.29.0.0, Compiler/Linker Version: V6.13.1

Target: STM32F429ZITx

Projekt do pobrania z: https://github.com/PiotrPoterala/PP_Library/tree/main/pp_unit_tests

CppUtest

CppUtest to framework oparty na modelu xUnit przeznaczony do przeprowadzania testów jednostkowych w projektach embedded. Napisany w C++ z powodzeniem może być również wykorzystany przy testowaniu kodu w C.

Główne założenia framework’a:

  • Prosty w użyciu,
  • Portowalny na wiele platform,
  • Stworzony do TDD.

Opis: http://cpputest.github.io

Kompilacja biblioteki CppUtest

  1. Pobierz projekt: https://github.com/cpputest/cpputest,
  2. Stwórz nowy, pusty projekt w Keil’u,
  3. W oknie Options for target:
    • W zakładce Device wybierz mikrokontroler, pod który będzie pisane oprogramowanie (w moim przypadku będzie to STM32F429ZITx),
    • W zakładce Target->ARM Compiler wybierz: Use default compiler version 6,
    • W zakładce Output zaznacz Create Library,
    • W zakładce C/C++(AC6):
      • W okienku Define dodaj „STM32F429xx, CPPUTEST_STD_CPP_LIB_DISABLED”,
      • W okienku Language C++ wybierz c++11,
      • W Include Path dodaj ścieżkę do katalogu include znajdującym się w drzewie projektu CppUtest,
  4. Do drzewa projektu dodaj:
    • wszystkie pliki *.cpp znajdujące się w katalogu src/CppUTest
    • plik src/Platforms/Iar/UtestPlatform.cpp,
  5. Zbuduj całość, a tym samym wygeneruj plik CppUTest.lib

Projekt ze scenariuszami testów

  1. Stwórz nowy, pusty projekt w Keil’u,
  2. W oknie Options for target:
    • W zakładce Device wybierz mikrokontroler, pod który będzie pisane oprogramowanie (a więc ten sam co poprzednio: STM32F429ZITx),
    • W zakładce Target->ARM Compiler wybierz: Use default compiler version 6,
    • W zakładce Output zaznacz Create Executable,
    • W zakładce C/C++(AC6):
      • W okienku Define dodaj „STM32F429xx”,
      • W okienku Language C++ wybierz c++11,
      • W Include Path dodaj ścieżkę do katalogu include znajdującym się w drzewie projektu CppUtest,
    • W zakładce Debug:
      • Zaznacz Use Simulator
      • W okienku Initialization File wybierz wcześniej stworzony plik map.ini zawierający informację o uprawnieniach dla poszczególnych obszarów pamięci (w tym przypadku przypisałem opcje READ/WRITE dla wszystkich adresów powyżej adresu 0x40000000 – od tego adresu zaczynają się rejestry peryferiów),
map.ini
MAP  0x40000000, 0xFFFFFFFF  READ WRITE
  1. W oknie Menage Run-Time Enviroment zaznacz Device::Startup, CMSIS::CORE oraz Compiler::I/O::STDOUT->ITM (redefiniuje funkcję fputc() ze standardowej biblioteki stdio.h tak aby podczas debugowania printf() przekazywał ciągi znaków do View->serial Windows-> debug (printf) viewer),
  1. Skonfiguruj startup_stm32f429xx.s.  Plik  służy do ustawienia:
    • rozmiaru stosu używanego przez wyjątki i procedury obsługi przerwań (ISR),
    • rozmiaru sterty używanej przez funkcje alokacji pamięci (ponieważ w projekcie wykorzystywany jest dynamiczny przydział pamięci do tworzenie egzemplarzy obiektów, należy zwiększyć rozmiar sterty do co najmniej 4kB) .
startup_stm32f429xx.s
; <h> Heap Configuration
;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>

Heap_Size       EQU     0x00004096

                AREA    HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem        SPACE   Heap_Size
__heap_limit
  1. Do drzewa projektu dodaj
    • wszystkie pliki *.cpp, które mają zostać przetestowane,
    • stworzony w poprzednim punkcie plik CppUTest.lib,
  2. Stwórz plik AllTests.cpp zawierający funkcję main(),
AllTests.cpp
#include "CppUTest/CommandLineTestRunner.h"

int main(int ac, char** av)
{
	
  const char * av_override[] = { "exe", "-v" }; //turn on verbose mode
  return CommandLineTestRunner::RunAllTests(2, av_override);
}
  1. Stwórz scenariusz testowy,
pstring_test.cpp
#include "CppUTest/TestHarness.h"

#include "pstring.h"


TEST_GROUP(PStringTestGroup)
{
  void setup() {}
  void teardown() {}
};


TEST(PStringTestGroup, findDataAfterAcronimTest)
{
	PString str("X10.123 Y20.458");
	
	STRCMP_EQUAL("10.123", str.findDataAfterAcronim('X').c_str());
	STRCMP_EQUAL("20.458", str.findDataAfterAcronim('Y').c_str());
}
  1. Zbuduj całość, wejdź w tryb debugowania i… Run

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *