基于Git与自动化脚本的C++项目构建与测试实践
本实践旨在完成一个结构清晰、可维护的C++程序项目,涵盖版本控制、编译自动化、单元测试及命令行文件输入功能的实现。项目基于寒假作业一的代码基础,通过优化架构、统一命名规范、编写构建与测试脚本,并集成Git版本管理,提升工程化开发能力。
1. 项目仓库初始化
使用GitHub Desktop创建公开仓库,步骤如下:- 启动GitHub Desktop,选择 File > New Repository
- 填写仓库名称(如
cplus-homework2)、描述,选择本地存储路径 - 确保取消勾选 Keep this code private,使仓库公开可访问
- 点击 Create Repository 完成初始化
随后,将本地代码克隆至该仓库目录,添加源码文件(如 main.cpp、utils.cpp)、测试文件与脚本,提交并推送:
- 在GitHub Desktop中点击 Commit to master
- 点击 Push origin 推送至远程仓库
为避免提交编译中间文件,创建 .gitignore 文件,内容如下:
*.exe
*.o
*.obj
Debug/
Release/
2. 代码架构与命名优化
原代码中长函数被拆分为多个职责单一的函数,每函数长度控制在15行以内。命名遵循小驼峰式(camelCase)规范,例如:changeChineseToDigit()替代原change()readInputFromFile()替代直接使用scanf- 常量使用全大写加下划线:
MAX_INPUT_LEN
核心函数 changeChineseToDigit() 实现中文数字到整数的映射:
#include <string.h>
int changeChineseToDigit(const char* chineseNum) {
if (strcmp(chineseNum, "零") == 0) return 0;
if (strcmp(chineseNum, "一") == 0) return 1;
if (strcmp(chineseNum, "二") == 0) return 2;
if (strcmp(chineseNum, "三") == 0) return 3;
if (strcmp(chineseNum, "四") == 0) return 4;
if (strcmp(chineseNum, "五") == 0) return 5;
if (strcmp(chineseNum, "六") == 0) return 6;
if (strcmp(chineseNum, "七") == 0) return 7;
if (strcmp(chineseNum, "八") == 0) return 8;
if (strcmp(chineseNum, "九") == 0) return 9;
if (strcmp(chineseNum, "十") == 0) return 10;
return -1;
}
3. 编译脚本设计
采用Windows批处理(.bat)实现一键编译。脚本build.bat 内容如下:
@echo off
setlocal enabledelayedexpansion
echo [构建] 请输入源文件路径(不含扩展名):
set /p sourceName=
set "sourceFile=!sourceName!.cpp"
if not exist "!sourceFile!" (
echo [错误] 源文件 !sourceFile! 不存在!
pause
exit /b 1
)
echo [构建] 正在编译 !sourceFile! ...
gcc "!sourceFile!" -o output.exe
if exist "output.exe" (
echo [成功] 编译完成:output.exe
) else (
echo [失败] 编译失败,请检查GCC配置
exit /b 1
)
pause
若系统提示 gcc: command not found,需将MinGW的bin目录(如 C:\Program Files\Dev-Cpp\MinGW64\bin)添加至系统环境变量 PATH 中。
4. 单元测试框架
设计测试用例覆盖正常与异常输入,测试函数testChineseToDigit():
#include <stdio.h>
#include <string.h>
// 假设此函数已定义于 utils.cpp
int changeChineseToDigit(const char* chineseNum);
int main() {
const char* validCases[] = {"零", "一", "二", "三", "四", "五", "六", "七", "八", "九", "十"};
const char* invalidCases[] = {"皮", "卡", "丘", "天", "线", "宝", "宝", "百"};
printf("=== 正常输入测试 ===\n");
for (int i = 0; i < 11; i++) {
int result = changeChineseToDigit(validCases[i]);
printf("输入: %-2s -> 结果: %d %s\n",
validCases[i], result, result != -1 ? "[通过]" : "[失败]");
}
printf("\n=== 异常输入测试 ===\n");
for (int i = 0; i < 8; i++) {
int result = changeChineseToDigit(invalidCases[i]);
printf("输入: %-2s -> 结果: %d %s\n",
invalidCases[i], result, result == -1 ? "[通过]" : "[失败]");
}
return 0;
}
配套测试脚本 test.bat:
@echo off
cd /d D:\cplus-homework2
echo [测试] 启动单元测试...
output.exe
echo [测试] 执行完毕
pause
5. 命令行文件输入功能
使用freopen() 重定向标准输入,实现从文件读取数据:
#include <stdio.h>
int main() {
char filename[100];
printf("请输入输入文件名(如 input.txt):\n");
scanf("%99s", filename);
FILE* input = freopen(filename, "r", stdin);
if (!input) {
printf("错误:无法打开文件 %s\n", filename);
return 1;
}
char buffer[256];
while (scanf("%255s", buffer) != EOF) {
int digit = changeChineseToDigit(buffer);
if (digit != -1) {
printf("转换结果:%d\n", digit);
} else {
printf("未知字符:%s\n", buffer);
}
}
return 0;
}
测试文件 input.txt 内容示例:
一 三 五 皮 九
运行程序后输入 input.txt,即可自动读取并转换文件中的中文数字。