其他
【连载】嵌入式测试驱动开发(1)
/***重点聊一聊为什么开该系列文章***/
前面我们讲解了几节shell脚本编程的相关知识,知识的讲得相对比较容易,有些小伙伴们可能并不是做linux上开发的可能有一部分小伙伴们更多的是用MCU或者DSP来进行一些特定功能的开发,可能对于目前而言这些小伙伴们对该部分知识需求不是很大。
嗯,那么这里我要单独开了一个系列叫做用C语言也能做测试驱动开发!其实开一个系列我也想了很久,原本的想法是目前对于大部分MCU或者是DSP性能方面都相对比较强大而且一般的应用为了避免一些耦合性,所以都会采用RTOS,那么目前用的比较火的话,而且比较免费的,那就属FreeRTOS了,可是讲解这一块我也不想讲的像目前各开发版商家们那样,只是详细讲解一下其内核部分,其他部分只是介绍一下接口函数,怎么应用。那又完全没有太大的意义,所以后面我会先整理一下思路,然后非常全面的把整个FreeRTOS各个板块都非常详细的解剖一下!
好了,那么问题来了,为什么我会在这里讲解用C语言也能进行测试驱动开发呢?首先可能大部分程序员都不会涉及到这一块,除非是非常正式完善的软件公司会有专门的测试人员,而且必须是白盒测试人员;而且一般的软件公司做上层应用的高级语言比如说java等,可能还用的概率比较大,但是做底层嵌入式是开发的,用测试驱动开发相对就非常少了。既然嵌入式用得这么少,为什么还要说呢?其实我觉得测试驱动开发应该是面向软件开发的一个过程,不会因为其语言的问题进行区分,只是目前我们用的相对比较少,但是并不代表未来,或者是以后就不会用上。特别的是在测试驱动开发中,你会形成一种非常好的思维形式,帮你减少代码的故障率,同时在开发代码的时候,也会能够给你更好的思路和设计模式,所以这里我会以一个系列的文章来讲解这一块的内容!
/***我们正式进入该主题***/
1)为什么使用TDD?
测试驱动开发(Test-Driven Development,TDD),这个名字好像非常宽泛的样子,其实说白了,就是用软件去测试你的应用程序. 比如说最简单的,我们写了一个加法函数,那么我们可以把该函数做一个测试单元,然后分别向该函数传入两个数值,这种结构是否与我们预期结果一致?如果一致则表示测试成功,如果不一致,则表示测试失败。没什么可怕的。其核心思想主要是把测试贯穿到我们软件开发中!从而形成一种固定的测试框架,保证我们代码的稳定性!
可能我们大部分工程师或者是学生都是先写好代码,写好了,一大堆代码,以后呢?然后进行后期的调试,可能这块调试需要耗费很长的时间,甚至会隐藏着很多bug;甚至像嵌入式的话,硬件组还没有弄好相关硬件那么软件很难展开工作。而我们采用TDD开发,由于精心构造了单元的测试文档,bug相对也会更少,并且程序的耦合性会降低,调试的时间将会更少等,其实最重要的是我们在修改代码以后,为了防止造成灾难性的程序bug,采用测试驱动开发,就能够降低该风险,因为这驱动需要自动执行一套非常完善的测试流程!所以这驱动也非常依赖于测试自动化!
2)自动化单元测试框架
自动化单元测试框架,其实就是进行测试驱动开发中一套比较成熟的软件架构!程序员只需要根据该测试框架的使用方法进行使用既能完成自动化的软件测试!比如说Unity—— 该软件框架是一个完全由C语言实现的测试软件框架;CppUtest——是一种用C++语言实现的自动化测试软件框架。其实这两种软件测试框架大同小异,仅仅是使用的格式上有所差异!
首先我们也要非常明确的一点,我们一些不太完善的测框架,也会导致整个程序崩溃的问题,比如说一个非常简单的例子,当我们要进行的测试代码中存在着数组越界的问题会导致测试框架的相关数据被修改成了,导致整个系统崩溃,这种问题定位就相对比较麻烦,所以这个时候我们在每次进行单元测试的时候前后都会输出相关的信息来表示一个测试的进度,这样就可以大体定位到相关的异常测试!
3)测试过程统一步骤
我们基本上会看到这些框架基本上都会遵循这四个步骤:
1)建立——主要是用于创建测试的一个运行环境,比如说变量的初始化,需要传入的参数等等;
2)运行——拿实际的所要测试的函数,或者是任务进行运行从而输出结果,比如说进行加法运算!
3)验证——拿着运行的结果与实际响应结果进行对比,是否是预期?如果是预期就表示测试成功并输出相关信息给用户,否则测试失败。
4)卸载——也就是我们需要吧,我们在测试前或者是在测试过程中申请的一些资源需要进行释放!
好了这里是公众号“最后一个bug”,感谢各位的关注,下期我将会拿具体的实例来进行剖析该主题!我们下期见!