使用Docker进行C++集成测试:实用指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

使用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("

博客

书籍推荐