首页 >后端开发 >C++ >测试是作弊,编译是怀疑

测试是作弊,编译是怀疑

DDD
DDD原创
2025-01-10 22:07:43790浏览

Tester c

本文探讨持续集成 (CI) 的概念、优势、劣势以及一个演示示例。

历史回顾

首先,我们简要回顾一下历史。

1999年,Kent Beck在其第一本关于极限编程的著作中深入探讨了这一主题。2001年,首批开源CI工具之一CruiseControl诞生。

为什么要使用CI?

CI 的目标是在每次提交代码后执行自动化测试。这确保代码始终保持功能正常。我们称之为持续集成,因为每次修改代码后都会对其进行验证,以确保没有出现回归问题。

优势

  • 尽早发现错误: 问题能够快速识别,从而能够及时响应。
  • 提高质量: 系统化测试保证了更健壮的代码。
  • 节省时间: 自动化流水线减少了重复手动测试的需要。

劣势

  • 初始成本: 建立CI可能需要大量的初始投入和专业技能。
  • 执行时间: 复杂的流水线可能会延长开发者验证代码所需的时间。

工作原理

在了解工作原理之前,我们先了解一些术语:

  • 作业 (Jobs): 一个容器(通常是Docker)的实例,用于执行脚本。这可能包括命令、测试或简单的操作,例如 echo。
  • 流水线 (Pipeline): 一系列按顺序或并行组织的作业。每次提交都会触发此系列操作以验证更改。

原理很简单:每个作业都会返回一个状态码(成功或失败)。如果某个作业失败,流水线将停止或根据配置跳过后续步骤。

实战演练

我们将使用基于GitLab CI的示例。可以通过.gitlab-ci.yml文件进行配置。

基础示例

<code>image: alpine:latest

myjobname:
  script:
    - make</code>

编译标志

添加编译标志,有两种方法:

  1. 通过Makefile中的规则。
  2. 直接在CI命令中传递标志。
<code>myjobname_hard:
  script:
    - CFLAGS="-Wall -Werror" make
    # 或者
    - make compile_flags</code>

使用Criterion进行测试和标志

Criterion是一个C语言的单元测试库。

Criterion的安装

在使用Criterion进行测试之前,需要安装Criterion。

<code>before_script:
  - apt-get update && apt-get install -y libcriterion-dev
script:
  - ./configure
  - make test</code>

多阶段构建

将单元测试和功能测试分成多个阶段,可以:

  • 更好地组织
  • 更好地查看结果
<code>stages:
  - build
  - test

build:
  stage: build
  script:
    - make all

test-unit:
  stage: test
  script:
    - make unit-test

test-functional:
  stage: test
  script:
    - make functional-test</code>

使用Clang格式化代码

代码格式对于维护整洁的代码库至关重要。

<code>image: alpine:latest

myjobname:
  script:
    - make</code>

缓存

在某些情况下,缓存文件或文件夹以避免每次流水线都重新加载它们非常有用。

一个常见的例子是JavaScript中的node_modules/文件夹。

<code>myjobname_hard:
  script:
    - CFLAGS="-Wall -Werror" make
    # 或者
    - make compile_flags</code>

当然,您可以根据需要使用流水线配置中的附加选项来清除缓存。

工件

工件是CI生成的可以跨作业共享或下载的文件。

例如,测试或覆盖率报告。

<code>before_script:
  - apt-get update && apt-get install -y libcriterion-dev
script:
  - ./configure
  - make test</code>

测试覆盖率

可以通过在CI流水线中集成gcovr或Cobertura等工具来衡量测试覆盖率。

<code>stages:
  - build
  - test

build:
  stage: build
  script:
    - make all

test-unit:
  stage: test
  script:
    - make unit-test

test-functional:
  stage: test
  script:
    - make functional-test</code>

报告

此代码块允许您将覆盖率报告集成到您的合并请求中,以便您可以查看未覆盖的代码以及覆盖率百分比。

<code>clang_format:
  stage: format
  before_script:
    - apt-get -qq update && apt-get -qq install -y clang-format autotools-dev autoconf-archive gcovr libcriterion-dev
  script:
    - clang-format -i $(find src/ -type f -name "*.c") --dry-run --Werror</code>

自定义环境

您可以通过选择特定的Docker镜像来指定CI的基本环境。

<code>cache:
  paths:
    - node_modules/

install:
  script:
    - npm install</code>

结合以上内容,可以得到如下示例:

<code>artifacts:
  paths:
    - build/
    - reports/</code>

注意.h文件,并且缺少before_script

额外补充

还可以检查垃圾文件,以确保make clean能够正常工作。

<code>test-coverage:
  stage: test
  script:
    - gcovr --html --html-details -o coverage.html
  artifacts:
    paths:
      - coverage.html</code>

总结

持续集成是一个极其强大的工具。虽然设置起来可能比较困难,但其收益是巨大的。

以上是测试是作弊,编译是怀疑的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn