前言
CJson是一个小型的C语言开源项目,用于 JSON 解析器和生成器,虽然项目小,可学习的点非常多,适合有一点C语言基础的新手提升技能和思路。
开源项目的一大亮点就是拥有完备的测试用例,这是一个容易被忽视的宝藏,里面有很多值得学习的内容,但大部分自研项目开发都是时间紧,任务重,能把功能开发完成就不错了,不大重视单元测试。
然而一个可测试的接口才是安全的、稳定的、内聚的、可维护的,写好单元测试不仅能提升代码能力也是脱颖而出的一条路,相信在以后会有越来越多的公司注重单元测试,因为好代码必然是可测的,不可测的代码必然走向一坨。
网上关于CJson的代码分析很多,我们这个系列打算从单元测试入手,一方面可以聚焦分析单个函数的实现,一方面也学习如何测试功能单元,等把各点串起来再看整体结构和综合测试。
环境准备
C语言的开发环境的配置一直是一个操蛋的事情,每个操作系统都不一样,之前为了有个Linux开发环境学习C语言,还专门在阿里云买了云计算,发现没有可视化界面,得用vim去编辑文件,在Mac上装了Linux虚拟机,但用起来总是不流畅,后来发现了一个在线开发网站Lightly,好消息是项目创建好能立马跑起来,非常容易上手,坏消息是一个月后得付费。
项目搭建
Lightly支持多种语言,选择一个语言然后创建一个项目
新建的项目main文件都建好了,直接点击绿色三角运行,立马输出“Hello World”,从来没有如此成功过
从Github将项目clone下来,目录结构如下,如果直接上传所有代码去编译也是可以的,但内容比较多,我们尽量简化工程,一点点去了解,所以先挑一些必要的代码上传到我们项目中
- 这个开源项目的核心就cJson.h、cJson.c两个文件,是后面分析的重点
- tests文件夹含测试文件和测试库unity,我们首先要编译运行的就是测试用例
- CMakeList.txt源文件比较复杂,不要使用,现简化如下,主要是编译子目录tests
cmake_minimum_required(VERSION 3.12)
project(cJson)
# 编译子文件夹的CMakeLists.txt
add_subdirectory(tests)
tests文件夹内容也比较多,先挑一个parse_number.c测试文件试试,所以目前只需要
- common.h、parse_number.c
- examples目录下的unity_config.h和src目录下三个文件
- CmakeList.txt也简化一下,只编译parse_number这个用例
# 生成目标库文件,SHARED代表动态的,STATIC代表静态的
add_library(unity STATIC unity/src/unity.c)
# 生成可执行文件文件
add_executable(parse_number parse_number.c)
# 对add_library或add_executable生成的文件进行链接操作
# 注意,库文件名称通常为libxxx.so,在这里只要写xxx即可
# target_link_libraries(库文件名称/可执行文件名称 链接的库文件名称)
target_link_libraries(parse_number unity)
按照同样的目录结构将文件上传到我们Lightly的项目中,cmake-build-debug目录和.clang-format是自动生成的,不用去管
项目的运行
目前为止,除了简化了两个CMakeLists文件,其它都保留原样,关于CMakeList入门可以看看这篇文章。要编译我们的项目,先新建build文件夹,然后在终端中依次输入下面指令即可,所有编译的产物都会放在build目录下,其中cmake .. 只需要第一次执行,后面需要重新编译,只需要一个make命令即可
cd build
cmake ..
make
编译的产物和源文件目录也是对应的,我们编译的文件在tests目录下,所以需要先进入这个目录,再运行我们的可执行文件parse_number,这个名称是在上面CMakeLists中指定的
cd tests
./parse_number
运行成功可以看到测试用例通过的输出
将项目成功运行之后,接下来我们一点一点深入了解一下,如果遇到什么问题,欢迎交流