TDD用于微控制器。第1部分:
微控制器的首次TDD 飞行。第2部分:间谍如何摆脱微控制器的TDD 依赖关系
。第3部分:在铁上运行

, , , , , , . . , . ( – ) , .
, . , .
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 – «» , , , .