首頁 >後端開發 >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>

編譯標誌

加入編譯標誌,有兩種方法:

    通過Makefile中的規則。
  1. 直接在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