使用Docker进行C++集成测试:从入门到精通

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

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

开始课程

使用Docker进行C++集成测试:从入门到精通



集成测试是任何严肃C++项目开发的关键阶段。它允许验证系统的各个模块如何协同工作,如何与数据库、网络服务和文件系统交互。在这种背景下,Docker成为不可或缺的工具:它提供了隔离、可重现的环境,消除了“在我机器上能运行”的问题。在本文中,我们将全面介绍使用Docker进行C++集成测试的配置流程——从基本概念到高级实践。



1. 为什么选择Docker进行C++集成测试?



传统的C++集成测试常常受到环境问题的困扰:不同版本的库、不兼容的编译器、特定的操作系统设置。Docker一劳永逸地解决了这些问题。主要优势:



  • 可重现性:每次测试都在相同的环境中运行,与主机系统无关。
  • 隔离性:容器之间互不影响,也不会影响主机系统。
  • 可扩展性:轻松并行运行数百个测试。
  • CI/CD集成:容器完美适配Jenkins、GitLab CI、GitHub Actions等流水线。


考虑一个简单的例子:您的C++应用程序使用PostgreSQL。没有Docker,您必须在每个测试服务器上安装和配置PostgreSQL。使用Docker,只需一行配置。



2. 为C++项目配置Docker环境



首先为我们的C++应用程序创建Dockerfile。假设项目使用CMake和Google Test进行单元测试,但我们需要与真实数据库进行集成测试。



用于构建和测试的基础Dockerfile:



# DockerfileFROM ubuntu:22.04 AS builder

RUN apt-get update && apt-get install -y \ build-essential \ cmake \ git \ libpq-dev \ libgtest-dev \ && rm -rf /var/lib/apt/lists/*

WORKDIR /appCOPY . .

RUN cmake -B build -DCMAKE_BUILD_TYPE=Release \ && cmake --build build --parallel

# 测试阶段FROM builder AS testerCMD ["./build/integration_tests"]


用于启动基础设施的Docker Compose:



# docker-compose.ymlversion: '3.8'

services: db: image: postgres:15 environment: POSTGRES_DB: testdb POSTGRES_USER: testuser POSTGRES_PASSWORD: testpass healthcheck: test: ["CMD-SHELL", "pg_isready -U testuser -d testdb"] interval: 5s timeout: 5s retries: 5

app: build: . depends_on: db: condition: service_healthy environment: DB_HOST: db DB_PORT: 5432 DB_NAME: testdb DB_USER: testuser DB_PASSWORD: testpass command: ["./build/integration_tests"]


3. 编写C++集成测试



考虑一个通过libpqxx库与PostgreSQL交互的集成测试示例。假设我们有一个用于用户管理的模块。



集成测试示例:



// integration_tests.cpp#include <gtest/gtest.h>#include <pqxx/pqxx>#include <string>#include <vector>

class DatabaseIntegrationTest : public ::testing::Test {protected: void SetUp() override { conn = new pqxx::connection( "host=" + std::getenv("DB_HOST") + " port=" + std::getenv("DB_PORT") + " dbname=" + std::getenv("DB_NAME") + " user=" + std::getenv("DB_USER") + " password=" + std::getenv("DB_PASSWORD") ); // 创建测试表 pqxx::work txn(*conn); txn.exec("CREATE TABLE IF NOT EXISTS use

博客

书籍推荐