使用Docker进行C++集成测试
现代C++开发不仅需要编写高质量的代码,还需要确保其在真实环境中可靠运行。集成测试是关键环节,用于验证系统组件(数据库、网络服务、文件系统)之间的交互。使用Docker进行集成测试可以提供隔离、可复现的环境,非常适合CI/CD流水线。本文将介绍如何使用Docker配置C++应用的集成测试,并提供实际示例。
为什么选择Docker进行C++集成测试?
传统的C++集成测试方法常常面临以下问题:
- 环境依赖:测试可能在开发者机器上通过,但在构建服务器上因库版本不同而失败。
- 配置复杂:使用真实数据库或外部API进行测试需要手动配置。
- 并行运行冲突:多个测试运行可能因共享资源而产生冲突。
Docker通过提供轻量级、隔离的容器解决了这些问题。您可以在单个docker-compose文件中启动测试数据库、运行C++服务并执行测试。这确保了在任何机器上环境都保持一致。
项目配置:基础示例
考虑一个简单的C++服务,用于将数据保存到PostgreSQL。集成测试需要以下内容:
- C++测试代码(使用Google Test)。
- 用于构建和运行测试的
Dockerfile。 - 用于编排容器的
docker-compose.yml。
项目结构:
my_cpp_project/├── src/│ ├── main.cpp│ ├── database.cpp│ └── database.h├── tests/│ └── test_integration.cpp├── CMakeLists.txt├── Dockerfile└── docker-compose.yml
Dockerfile:
FROM gcc:latest AS builder
WORKDIR /appCOPY . .
RUN apt-get update && apt-get install -y cmake libpq-devRUN cmake -B build -DCMAKE_BUILD_TYPE=ReleaseRUN cmake --build build
FROM ubuntu:22.04
RUN apt-get update && apt-get install -y libpq-devCOPY --from=builder /app/build/tests /app/testsCOPY --from=builder /app/build/my_app /app/my_app
ENTRYPOINT ["/app/tests"]docker-compose.yml:
version: '3.8'services: db: image: postgres:15 environment: POSTGRES_USER: testuser POSTGRES_PASSWORD: testpass POSTGRES_DB: testdb ports: - "5432:5432" healthcheck: test: ["CMD-SHELL", "pg_isready -U testuser -d testdb"] interval: 5s timeout: 5s retries: 5
test: build: . depends_on: db: condition: service_healthy environment: DB_HOST: db DB_PORT: 5432 DB_USER: testuser DB_PASSWORD: testpass DB_NAME: testdb编写C++集成测试
现在创建测试,验证数据库的写入和读取操作。使用Google Test和libpqxx库与PostgreSQL交互。
tests/test_integration.cpp:
#include <gtest/gtest.h>#include <pqxx/pqxx>#include <string>
class DatabaseTest : public ::testing::Test {protected: void SetUp() override { conn = new pqxx::connection( "host=" + std::string(std::getenv("DB_HOST")) + " port=" + std::string(std::getenv("DB_PORT")) + " user=" + std::string(std::getenv("DB_USER")) + " password=" + std::string(std::getenv("DB_PASSWORD")) + " dbname=" + std::string(std::getenv("