Unity单元测试初篇_unity 单元测试

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化的资料的朋友,可以戳这里获取

前言

昨天被师兄问起程序单元测试的问题, 顿时一脸懵逼, 啥? 单元测试. 折腾了一天, 用Unity好歹撸出来一个HelloWorld级别的LED单元测试, 下面记录下过程, 感觉好久不写博客了, 竟有种无法下笔的感觉, 还是从这篇慢慢拾起来吧.

STM32CubeMX

先用STM32CubeMX 5.6.1建一个工程:

  • MCU选择: 打开 STM32CubeMX, 点击 ACCESS TO MCU SELECTOR, 选择 STM32F767VITx
  • 调试端口配置为SWD: Pinout & Configuration -> System Core -> SYS -> Debug 选择 Serial Wire
  • Pinout & Configuration -> System Core -> RCC -> HSE 选择 Crystal/Ceramic Resonator(外部用的25M晶振)
  • Clock Configuration:
    在这里插入图片描述
  • 配置LED(PD12接LED, 低电平点亮): 单击PD12引脚, 设为GPIO_Output, 然后右键PD12, 选择Enter User Label, 输入LEDR:
    在这里插入图片描述
  • 配置串口(Unity测试结果可以通过串口打印出来, 这里用USART3): Pinout & Configuration -> Connectivity -> USART3, Mode选择Asynchronous, 波特率默认115200, 引脚我挪到了板子上对应的PD8,PD9:
    在这里插入图片描述
  • Project Manager -> Project -> Browse 选择工程位置(Project Location), 填入工程名(Project Name), Toolchain/IDE 选择 MDK-ARM.
    在这里插入图片描述
    Project Manager -> Code Generator -> 勾选Copy only the necessary library files, 还有Generate peripheral initialization as a pair of .c/.h files per periphral
    在这里插入图片描述
  • 点击右上角 GENERATE CODE 按钮生成代码, 打开工程.
  • Keil 点击魔术棒或者Project -> Options for Target ..., 默认配置DebugST-link Debugger, 点击Setting -> Flash Download -> 勾选Reset and Run, 点击Pack去掉Enable(听说是新版Keil的锅?) 这样下载后可以自动复位运行.
    在这里插入图片描述
    在这里插入图片描述

添加功能代码

gpio.c的最下面添加led_on()和led_off()两个函数:

/\* USER CODE BEGIN 2 \*/
GPIO_PinState led\_on(void)
{
	HAL\_GPIO\_WritePin(LEDR_GPIO_Port, LEDR_Pin, GPIO_PIN_RESET);
	return HAL\_GPIO\_ReadPin(LEDR_GPIO_Port, LEDR_Pin);
}

GPIO_PinState led\_off(void)
{
	HAL\_GPIO\_WritePin(LEDR_GPIO_Port, LEDR_Pin, GPIO_PIN_SET);
	return HAL\_GPIO\_ReadPin(LEDR_GPIO_Port, LEDR_Pin);
}
/\* USER CODE END 2 \*/

gpio.h声明一下:

/\* USER CODE BEGIN Prototypes \*/
extern GPIO_PinState led\_on(void);
extern GPIO_PinState led\_off(void);
/\* USER CODE END Prototypes \*/

为了支持printf, 直接在usart.c的最下面添加串口的重定向:

/\* USER CODE BEGIN 1 \*/
#ifdef \_\_GNUC\_\_
  /\* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
 set to 'Yes') calls \_\_io\_putchar() \*/
  #define PUTCHAR\_PROTOTYPE int \_\_io\_putchar(int ch)
#else
  #define PUTCHAR\_PROTOTYPE int fputc(int ch, FILE \*f)
#endif /\* \_\_GNUC\_\_ \*/
/\*\*
 \* @brief Retargets the C library printf function to the USART.
 \* @param None
 \* @retval None
 \*/
PUTCHAR_PROTOTYPE
{
  /\* Place your implementation of fputc here \*/
  /\* e.g. write a character to the EVAL\_COM1 and Loop until the end of transmission \*/
  HAL\_UART\_Transmit(&huart3, (uint8_t \*)&ch, 1, 0xFFFF);

  return ch;
}
/\* USER CODE END 1 \*/

在main.h添加头文件:

/\* USER CODE BEGIN Includes \*/
#include <stdio.h>
#include "gpio.h"
/\* USER CODE END Includes \*/

在main.c的while(1)里面先测试一下:

  while (1)
  {
    /\* USER CODE END WHILE \*/

    /\* USER CODE BEGIN 3 \*/
		led\_on();
		HAL\_Delay(1000);
		led\_off();
		HAL\_Delay(300);
		printf("hahage\r\n");
  }
  /\* USER CODE END 3 \*/

编译下载, 发现LED闪烁状态正确, 串口115200-8-N-1打印正常.

加入Unity单元测试

这里仅以测试上面的led_on()和led_off()两个函数为例. (为什么都看到灯亮了还测试, 咳咳, 人艰不拆…).

Unity Github把master下载下来, 可以git clone https://github.com/ThrowTheSwitch/Unity.git, 也可以直接下载zip包:
在这里插入图片描述
拷贝从GitHub上拉下来的以下几个文件到上面STM32工程的 /Drivers/Unity(新建的)文件夹里:

  • Unity/src/unity.c
  • Unity/src/unity.h
  • Unity/src/unity_internals.h
  • Unity/src/unity_config.h

打开Keil工程, 点击工程管理按钮, 新添Target: UnitTest, 并点击Set as Current Target按钮, 新添Groups: Drivers/Unity, 然后点击Add Files按钮, 把/Drivers/Unity目录下的unity.c添加进来:
在这里插入图片描述
魔术棒这里还是要再配置一下的:
在这里插入图片描述
接下来把头文件路径包含进来:
在这里插入图片描述
Drivers/Unity Group添加新文件main1.c, 把main.c的所有内容拷贝到main1.c, 然后main.c右键:
在这里插入图片描述
去掉Include in Target Build勾选, 这样UnitTest这个Target就不会编译main.c这个文件了:
在这里插入图片描述

Drivers/Unity Group添加新文件test_gpio.c, 添加以下内容:

#include "gpio.h"
#include "unity.h"

void setUp(void)
{
}

void tearDown(void)
{
}

void test\_led\_on(void)
{
	TEST\_ASSERT\_EQUAL(GPIO_PIN_RESET, led\_on());
	TEST\_ASSERT\_EQUAL(GPIO_PIN_RESET, led\_on());
}

void test\_led\_off(void)
{
	TEST\_ASSERT\_EQUAL(GPIO_PIN_SET, led\_off());
	TEST\_ASSERT\_EQUAL(GPIO_PIN_SET, led\_off());
}


整个工程的目录看下来是这样的:
在这里插入图片描述

main1.c添加:

/\* USER CODE BEGIN Includes \*/
#include "unity.h"
/\* USER CODE END Includes \*/

/\* USER CODE BEGIN 0 \*/
extern void setUp(void);
extern void tearDown(void);
extern void test\_led\_on(void);
extern void test\_led\_off(void);

/\*=======Test Reset Option=====\*/
void resetTest(void);
void resetTest(void)
{
  tearDown();
  setUp();
}
/\* USER CODE END 0 \*/

  /\* USER CODE BEGIN 2 \*/
	


![img](https://img-blog.csdnimg.cn/img_convert/1c1d5c24c61a58fee85397f6a273ddf8.png)
![img](https://img-blog.csdnimg.cn/img_convert/0bda00fd256057617f5923fefe35f587.png)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618631832)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

317)]

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618631832)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值