92 / 19 / 4
Регистрация: 11.04.2015
Сообщений: 1,015
Записей в блоге: 1

James W. Grenning - Test Driven Development for Embedded C

24.09.2021, 18:24. Показов 756. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте !

Кто нибудь читал эту книгу или, может быть, знаком с юнит-тестированием для Embedded C ? Я немного застрял на домашних заданиях из пятой части. В этой части он предлагает сделать следующее :

1. Test some of your production code off the target. Choose something simple that has few external dependencies.
2. Compile CppUTest or Unity for your target. Run the unit tests.
3. Write a script that uploads your test executable, runs it, and reports pass or fail.
По первому заданию. У меня есть несколько простых проектов для evaluation board STM32L152RE. Один из них такой : переменное сопротивление подключено к выходу 3.3В на плате и к ADC и значение получаемого напряжения выводится на экран PuTTY. Вот его код :

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
/* Includes ------------------------------------------------------------------*/
#include "main.h"
 
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <string.h>
#include <stdio.h>
/* USER CODE END Includes */
 
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
 
/* USER CODE END PTD */
 
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */
 
/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
 
/* USER CODE END PM */
 
/* Private variables ---------------------------------------------------------*/
ADC_HandleTypeDef hadc;
 
UART_HandleTypeDef huart2;
 
/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
 
/* USER CODE END PV */
 
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART2_UART_Init(void);
static void MX_ADC_Init(void);
/* USER CODE BEGIN PFP */
/* Private function prototypes -----------------------------------------------*/
 
/* USER CODE END PFP */
 
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
 
/* USER CODE END 0 */
 
/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */
char str1[9]={0}, str2[9]={0}; 
int Level=0, PrevLevel=0, count1=0;
float Voltage=0.0, PrevVoltage=0.0;
  /* USER CODE END 1 */
 
  /* MCU Configuration--------------------------------------------------------*/
 
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();
 
  /* USER CODE BEGIN Init */
 
  /* USER CODE END Init */
 
  /* Configure the system clock */
  SystemClock_Config();
 
  /* USER CODE BEGIN SysInit */
 
  /* USER CODE END SysInit */
 
  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART2_UART_Init();
  MX_ADC_Init();
  /* USER CODE BEGIN 2 */
 
  /* USER CODE END 2 */
 
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
 
    /* USER CODE END WHILE */
 
    /* USER CODE BEGIN 3 */
      HAL_ADC_Start(&hadc); 
        HAL_ADC_PollForConversion(&hadc,100);
        PrevLevel= (int)HAL_ADC_GetValue(&hadc);
        HAL_ADC_Stop(&hadc);  
        
        for(count1=0; count1<=200; count1++){
            HAL_ADC_Start(&hadc); 
            HAL_ADC_PollForConversion(&hadc,100);
            Level= (int)HAL_ADC_GetValue(&hadc);
            HAL_ADC_Stop(&hadc);
        
            PrevVoltage=PrevLevel*3.3/4095;
            Voltage=Level*3.3/4095;
        
            if(Voltage>PrevVoltage){
                if( ((int)(Voltage*100)-(int)(PrevVoltage*100))>0 ){
                    Level=PrevLevel;
                    continue;
                }
            }
            if(Voltage<PrevVoltage){
                if( ((int)(PrevVoltage*100)-(int)(Voltage*100))>0 ){
                    Level=PrevLevel;
                    continue;
                }
            }
        
            sprintf(str1,"%4d", Level);
            sprintf(str2,"%.6f", Voltage);
            HAL_UART_Transmit( &huart2, "The ADC level is ", 18, 100);
            HAL_UART_Transmit( &huart2, (uint8_t *)str1, 10, 100);
            HAL_UART_Transmit( &huart2, " , voltage is ", 15, 100);
            HAL_UART_Transmit( &huart2, (uint8_t *)str2, 10, 100);
            HAL_UART_Transmit( &huart2, "\r\n", 2, 100);
        }
        Level=0;
        PrevLevel=0;
        HAL_Delay(500);
  }
  /* USER CODE END 3 */
}
Мне не понятно первое задание. Как написать юнит-тесты к этому коду и потестить его вне target ? Target как таковой у меня нет, есть только eval board. Значит ли это, что я должен потестить его вне eval board ?

Добавлено через 2 часа 8 минут
Поясню свой вопрос. Из предыдущих глав книги, я научился писать юнит-тесты одновременно составляя драйвер. Тут же надо написать юнит-тесты к уже готовому коду, который изменениям не подлежит, насколько я понял. Как это сделать ? И с чего начать ?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.09.2021, 18:24
Ответы с готовыми решениями:

Data driven test по данным из Access
вот есть такой тестusing System; using System.Collections.Generic; using System.Linq; using System.Text; using...

Data Driven Test, провайдер базы данных
Добрый день! Пытаюсь настроить в VS 2010 тестирование. Не могу понять какой провайдер нужно использовать для работы с MSSQLSERVER. ...

Software Development Engineer in Test - SDET (Automated Test Engineer / QA Engineer) - Denmark
Software Development Engineer in Test - SDET (Automated Test Engineer / QA Engineer) - Denmark, Copenhagen One of the leading...

2
210 / 163 / 36
Регистрация: 15.11.2012
Сообщений: 788
25.09.2021, 00:23
Ваша программа на мой взгляд не подходит под задачу такого тестирования. Оно предполагает получение от тестовой программы какого-то запроса или команды с какими-то параметрами, выполнения чего-либо и ответа. А там уже правильно-неправильно.
В случае программы с переменным резистором ваша тестовая программа ничего никуда не отправляет по самой идее, "тестером" является сам переменный резистор, а не тестовая программа. И проверять надо показания АЦП контроллера на PuTTY, сопоставляя их с напряжением на среднем выводе резистора.

Иначе говоря именно резистор здесь является
Цитата Сообщение от max_sk Посмотреть сообщение
external dependencies.
0
 Аватар для Voland_
1978 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
27.09.2021, 11:00
Цитата Сообщение от max_sk Посмотреть сообщение
ак написать юнит-тесты к этому коду и потестить его вне target ?
с помощью Unity Вы должны организовать генерацию mock-хедеров и mock-функций - все это из хедеров библиотек, включенных в ваш тестируемый файл (и во все его включенные, скажем, в "main.h"). Ну, а потом Вы формируете тест, в котором вызываете саму main(), со всеми "внешними" (то есть mock) функциями с суффиксом "...Expect(...)" или "...ExpectAndReturn(...)", или "...Ignore(...)" в зависимости от необходимых тестов.

То есть в вашем случае, сам тест будет выглядеть примерно так:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include "uartlib_mock.h"  // подключаем mock-хедер(ы) либы UART. Он должен называться, как и сама либа, но с суффиксом "_mock"
 
void setup() {
    uartlib_mockInit();
    // ... инициируем все mock'и всех внешних библиотек
}
 
void teardown() {
    uartlib_mockVerify();
    // ... проверяем все mock'и всех внешних библиотек
}
 
 
void test_main(int test) {
    MX_GPIO_InitExpect(); // Ожидаем вызов функции
    MX_USART2_UART_InitExpect(); // Ожидаем вызов функции
    MX_ADC_InitExpect(); // Ожидаем вызов функции
    // ... готовим другие функции
    HAL_ADC_StartExpect(&hadc); // Показываем, что функция должна на входе получить параметр "&hadc"
    HAL_ADC_PollForConversionExpect(&hadc,100); // Показываем, что функция должна на входе получить параметр "&hadc, 100"
    HAL_ADC_GetValueExpectAndReturn(&hadc, 20); // Показываем, что функция должна на входе получить параметр "&hadc" и вернуть "20"
    // ... последовательность, количество вызывов и соответствие входных/выходных параметров в тесте должны быть соблюдены
   
    main();  // Вызываем тест функции
 
    // проверяем внешние пераметры, которые изменила функция    
}
Ну, и конечно, для бесконечных циклов скорее всего придется либо все "внутренности" выносить в отдельную функцию, и вызывать ее из unit-test'а (это прием уже тактики "design-for-test"), либо нужно обернуть этот цикл в "#ifndef UNITTEST ... #endif", чтобы исключить "бесконечность" цикла при запуске. Но это зависит и от имплементации кода
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.09.2021, 11:00
Помогаю со студенческими работами здесь

Software Development Engineer for Test, Севастополь, 2-3k$
В связи с расширением, в один очень интересный и перспективный проект, международная IT- компания с офисом в г. Севастополь, приглашает:...

Software Development Engineer in Test at Microsoft (C#/ C++ / Java) - Dublin
Microsoft is looking talented programmers to join the Software Developers Engineers in Test (SDET) Team. Knowledge and Experience: ...

Сколько памяти (в байтах) займет данный массив: class Test { public: int c=0,r=0; double q = 0; }; Test *Mass = new Test
Сколько памяти (в байтах) займет данный массив: class Test { public: int c=0, r=0; double q = 0; }; Test *Mass = new...

Как перенаправить с test.ru на test.test.ru (на одном компьютере)
Как сделать так чтобы на комп1 при вводе например: google.ru попадал на другой сайт(в данном случае сайт с доменом 3 его уровня:...

Замена формата ссылок находящихся в html документе с http://test. на <a href='http://test.'>test.</a>
Помогите написать код для следующей задачи: На вход программы подается произвольный html-файл (запрашивается путь к html файлу),...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

Новые блоги и статьи
Тестирование Pull Request в Kubernetes с vCluster
Mr. Docker 19.07.2025
Часто сталкиваюсь с серьезной дилемой при настройке тестовых окружений для проверки Pull Request в Kubernetes. С одной стороны, каждый PR требует изолированной среды — только так можно гарантировать,. . .
Мой 7 минутный ролик с крамольным предложением про шахматы, предлагаю заценить
_Ivana 18.07.2025
p2UhJNMGY94
Десять Middleware Node.js для эффективного кодинга
Reangularity 18.07.2025
Когда я только начинал работать с Node. js, количество пакетов в npm меня буквально парализовало. Сегодня их больше 1,3 миллиона — попробуй разберись, что стоит твоего внимания, а что нет. Я потратил. . .
Context и глубины Android
mobDevWorks 18.07.2025
В Android разработки Context напоминает воздух - он везде, жизненно необходим, но мало кто может детально объяснить его природу. Мы привыкли получать его как параметр, передавать дальше и. . .
Результаты исследования от команды MCM (июль 2025 г.)
Programma_Boinc 18.07.2025
Результаты исследования от команды MCM (июль 2025 г. ) Как сообщалось в наших предыдущих публикациях, мы изучаем гены, которые имеют наибольший рейтинг и ассоциируются с различными видами рака, в. . .
ИИ-чатбот на React с OpenAI и LangChain.js
Reangularity 17.07.2025
React давно стал для меня золотым стандартом фронтенд-разработки. Его компонентная структура, виртуальный DOM и однонаправленный поток данных идеально подходят для создания динамичных интерфейсов. . .
Пишем адаптер для локального хранилища S3 на C#
stackOverflow 16.07.2025
Разработка современных приложений часто требует интеграции с объектными хранилищами, и Amazon S3 стал де-факто стандартом в этой области. Однако работа с облачными сервисами в процессе разработки. . .
Старые замки
kumehtar 16.07.2025
Смотрел тут фото, попались пара старых замков. И сразу бросилось в глаза из отличие. Например: Замок Бистон, в англии. Разрушенное сооружение. Но - не испорченное людьми, по крайней мере - на. . .
Java и Eclipse Store: Сверхбыстрые приложения с In-Memory DB
Javaican 15.07.2025
Eclipse Store — это микро-движок персистентности для Java, который позволяет хранить и извлекать нативные Java-объекты без необходимости преобразования данных или использования объектно-реляционного. . .
EmBitz, создание проекта, отладка, прошивка
locm 15.07.2025
Создание проекта для Blue Pill (STM32F103C8T6) в EmBitz 2. 30, написания кода blink, запуск отладки в ОЗУ, заливка релизной прошивки во flash используя ST-Link и др. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru