TDD fĂŒr Mikrocontroller. Teil 1: Erster
TDD- Flug fĂŒr Mikrocontroller. Teil 2: Wie Spione TDD- AbhĂ€ngigkeiten
fĂŒr Mikrocontroller beseitigen. Teil 3: Laufen auf Eisen

, , , , , , . . , . ( â ) , .
, . , .
Test-driven development (TDD). TDD ? .
TDD
, TDD Test-last development (TLD). TDD , .

TDD
TDD :
- TDD , ;
- TDD : «» ;
- , ;
- TDD ;
- : - , ;
- .
. , , . . , Android Studio .
( â ) , , . , . . (Integrated Development Environment â IDE). :
embedded, TLD TDD?
TDD ?
.
embedded
:
, IDE. â Hardware Abstraction Level (HAL). IDE . , . ( ).
, TDD :
- ?
- ?
- ?
, TDD. . , , .
- ( ) , , .
- TDD, .
- () STM32F103C8, , , TDD .
GitLab.
embedded- - , . . , . . UART-, â - . , :
STM32F103C8, STM32 , .

-. , -, . ( Programming manual).
- , .
IDE , , . «» C, ++, . -:
- IDE â Visual Studio, , . IDE «» C.
- CppUTest â , unit- C/C++.
Visual Studio
- Visual Studio, Visual C++ Tests « Windows». (, spies, mocks, stubs . .).
Tests- Properties -> C/C++ -> General -> Additional Include Directories :
â $(CPP_U_TEST)\include
â $(SolutionDir)..\Firmware\Project\Include ( )
- Properties -> Linker -> Input :
â $(CPP_U_TEST)\lib\cpputestd.lib
â $(SolutionDir)Debug\ProductionCodeLib.lib
$(CPP_U_TEST) â Windows, cpputest (. ).
Tests.cpp :
#include "CppUTest/CommandLineTestRunner.h"
int main(int argc, char** argv)
{
return RUN_ALL_TESTS(argc, argv);
}

ProductionCodeLib, â Visual C++. -, «», . . , STM32F103C8.
ProductionCodeLib, :
- Properties -> C/C++ -> General -> Additional Include Directories \$(SolutionDir)..\Firmware\Project\Include\
, «Run», , :
OK (0 tests, 0 ran, 0 checks, 0 ignored, 0 filtered out, 0 ms)
, .
TDD
«» C, . -, «» . Configurator
, :
, . ( ) , . 5 . - Configurator.
-
1. read
, -.
2. write
-.
3. erase
.
4. help
.
5.
.
ASCII.
CppUTest
ConfiguratorTests.cpp
Tests
, TDD.
CppUTest
.
CppUTest:
TEST_GROUP(TestGroupName)
{
void setup()
{
}
void teardown()
{
}
};
TEST(TestGroupName, TestName)
{
}
:
- TEST_GROUP â , setup() teardown(), ;
- setup() â , ;
- teardown() â , ;
- TEST â , , ;
- TestGroupName â , ;
- TestName â .
. , . , Configurator
setup()
, teardown()
. , , . - , NULL
. ShouldNotBeNull.
ShouldNotBeNull:
TEST_GROUP(Configurator)
{
Configurator * configurator = NULL;
void setup()
{
configurator = Configurator_Create();
}
void teardown()
{
Configurator_Destroy(configurator);
}
};
TEST(Configurator, ShouldNotBeNull)
{
CHECK_TRUE(configurator);
}
, , Configurator_Create
Configurator_Destroy
. . ProductionCodeLib
. Configurator.h
Configurator.c
, -. Configurator.h
. Configurator.c
, . . . , .
ShouldNotBeNull:
typedef struct ConfiguratorStruct Configurator;
Configurator * Configurator_Create(void);
void Configurator_Destroy(Configurator * self);
#include "Configurator.h"
typedef struct ConfiguratorStruct
{
char command[32];
} ConfiguratorStruct;
Configurator * Configurator_Create(void)
{
return NULL;
}
void Configurator_Destroy(Configurator * self)
{
}
TDD , , (. . Configurator_Create
). failed
, . , test-fails.
:
d:\\exampletdd\\tests\\tests\\configuratortests.cpp(27): error: Failure in TEST(Configurator, ShouldNotBeNull)
CHECK_TRUE(configurator) failed
.
Errors (1 failures, 1 tests, 1 ran, 1 checks, 0 ignored, 0 filtered out, 2 ms)
test-passes . Configurator_Create , ShouldNotBeNull. , Configurator_Destroy.
Configurator_Create Configurator_Destroy :
Configurator * Configurator_Create(void)
{
Configurator * self = (Configurator*)calloc(1, sizeof(ConfiguratorStruct));
return self;
}
void Configurator_Destroy(Configurator * self)
{
if (self == NULL)
{
return;
}
free(self);
self = NULL;
}
:
.
OK (1 tests, 1 ran, 1 checks, 0 ignored, 0 filtered out, 0 ms)
, test-passes . , , , , . . , «» 32
#define ( enum
const
define
).
(«» ) #define:
#define SERIAL_RECEIVE_BUFFER_SIZE 32
typedef struct ConfiguratorStruct
{
char command[SERIAL_RECEIVE_BUFFER_SIZE];
} ConfiguratorStruct;
, :
- , .
- IDE .
- , «Run» ( ), .
TDD -. «» , . âŠ

Raccoon Security â «» , , , .