詳解criterion:C語言單元測試框架

作為一名C語言開發工程師,我們都知道單元測試對於保證代碼質量是至關重要的。而criterion正是一個為C語言開發者所設計的單元測試框架,可以幫助我們更方便地進行單元測試。本文將會從多個方面闡述criterion的使用方法及其優勢。

一、快速入門

使用criterion編寫單元測試非常簡單,只需包含criterion頭文件並在main函數中編寫測試用例即可。我們以一個簡單的例子來說明:

#include <criterion/criterion.h>

int square(int num) {
  return num * num;
}

Test(my_tests, square_of_zero) {
  cr_assert_eq(0, square(0));
}

Test(my_tests, square_of_positive) {
  cr_assert_eq(4, square(2));
  cr_assert_eq(9, square(3));
}

Test(my_tests, square_of_negative) {
  cr_assert_eq(9, square(-3));
}

上述代碼將會測試square函數三個不同輸入情況下的輸出是否符合預期。我們使用了cr_assert_eq斷言來判斷程序輸出是否和預期一致。

二、使用斷言

criterion提供的斷言非常豐富,可以滿足大部分的單元測試需求。以下是一些常用的斷言:

  • cr_assert(expr) – 判斷表達式expr是否為真
  • cr_assert_eq(val1, val2) – 判斷val1和val2是否相等
  • cr_assert_neq(val1, val2) – 判斷val1和val2是否不相等
  • cr_assert_lt(val1, val2) – 判斷val1是否小於val2
  • cr_assert_leq(val1, val2) – 判斷val1是否小於等於val2
  • cr_assert_gt(val1, val2) – 判斷val1是否大於val2
  • cr_assert_geq(val1, val2) – 判斷val1是否大於等於val2

我們將會在接下來的測試用例中使用這些斷言對我們寫的函數進行測試。

三、隔離測試

在實際的測試中,我們有時候需要對某個函數進行測試,但是這個函數所依賴的其他函數可能還沒有被實現或者還沒有測試通過。這個時候,我們可以使用criterion提供的mock功能。以下是一個示例:

#include <criterion/criterion.h>

// 我們要測試的函數
int sum(int a, int b) {
  return a + b + 1; // 為了方便演示,故意寫成了a+b+1,實際上應該是a+b
}

// mock依賴的函數
int add_one(int num) {
  return num + 1;
}

Test(my_tests, sum_of_positive) {
  // 設定mock
  cr_mock(add_one, int, (int num), { return num; });

  // 進行測試
  cr_assert_eq(4, sum(1, 2));

  // 取消mock
  cr_unmock(add_one);
}

我們通過設定mock將add_one函數的輸出設定為輸入值本身,使得測試用例可以順利運行,而不需要考慮add_one函數的實際實現。

四、集成其他測試框架

criterion還可以集成其他測試框架,如CMocka和Unity。我們只需要引入criterion_adapter頭文件並使用宏即可:

#include <criterion/criterion.h>
#include <criterion/criterion_adapter.h>

// 集成CMocka
#define CTEST_SEGFAULT cr_assert_fail("segmentation fault");
#define CTEST_ABORT cr_skip_test("aborted");

void segfault_test(void **state) {
  int *a = NULL;
  *a = 1;
}

Test(my_tests, using_cmocka,
     .init = cr_redirect_stderr,
     .signal = CTEST_SEGFAULT,
     .abort = CTEST_ABORT) {
  const UnitTest tests[] = {
    unit_test(segfault_test),
  };

  return cmocka_run_group_tests(tests, NULL, NULL);
}

// 集成Unity
Test(my_tests, using_unity) {
  cr_run_test(UnityMain(argc, argv, RunAllTests));
}

上述代碼分別演示了如何集成CMocka和Unity,並且展示了如何使用criterion提供的宏。我們可以通過串聯測試用例和使用.init、.signal、.abort三個參數來達到我們需要的測試效果。

五、自定義輸出

有時候我們需要對測試結果進行自定義輸出,criterion也提供了這個功能。以下是一個示例:

#include <criterion/criterion.h>

Test(my_tests, custom_output,
     .init = cr_redirect_stdout,
     .fini = cr_assert_stdout_eq_str("Output for my test\n")) {
  printf("Output for my test\n");
}

我們使用cr_redirect_stdout將標準輸出重定向到一個緩衝區中,並使用cr_assert_stdout_eq_str斷言判斷緩衝區中的輸出是否和預期一致。

六、總結

本文從快速入門、使用斷言、隔離測試、集成其他測試框架、自定義輸出等多個方面對criterion進行了詳細的闡述。希望本文可以幫助到初學者了解criterion的使用方法,並且能夠更好地進行C語言單元測試工作。

原創文章,作者:KEOGJ,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/370911.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
KEOGJ的頭像KEOGJ
上一篇 2025-04-23 00:48
下一篇 2025-04-23 00:48

相關推薦

  • Ojlat:一款快速開發Web應用程序的框架

    Ojlat是一款用於快速開發Web應用程序的框架。它的主要特點是高效、易用、可擴展且功能齊全。通過Ojlat,開發人員可以輕鬆地構建出高質量的Web應用程序。本文將從多個方面對Oj…

    編程 2025-04-29
  • Zlios——一個多功能的開發框架

    你是否在開發過程中常常遇到同樣的問題,需要不斷去尋找解決方案?你是否想要一個多功能、易於使用的開發框架來解決這些問題?那麼,Zlios就是你需要的框架。 一、簡介 Zlios是一個…

    編程 2025-04-29
  • AES加密解密算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES算法,並對實現過程進…

    編程 2025-04-29
  • 學習Python對學習C語言有幫助嗎?

    Python和C語言是兩種非常受歡迎的編程語言,在程序開發中都扮演着非常重要的角色。那麼,學習Python對學習C語言有幫助嗎?答案是肯定的。在本文中,我們將從多個角度探討Pyth…

    編程 2025-04-29
  • agavi開發框架

    Agavi是一個基於MVC模式的Web應用程序開發框架,以REST和面向資源的設計為核心思想。本文章將從Agavi的概念、優點、使用方法和實例等方面進行詳細介紹。 一、概念 Aga…

    編程 2025-04-29
  • Python被稱為膠水語言

    Python作為一種跨平台的解釋性高級語言,最大的特點是被稱為”膠水語言”。 一、簡單易學 Python的語法簡單易學,更加人性化,這使得它成為了初學者的入…

    編程 2025-04-29
  • Python unittest框架用法介紹

    Python unittest框架是Python自帶的一種測試框架,可以用來編寫並運行測試用例。在本文中,我們將從以下幾個方面詳細介紹Python unittest框架的使用方法和…

    編程 2025-04-29
  • com.alipay.sofa.bolt框架

    com.alipay.sofa.bolt框架是一款高性能、輕量級、可擴展的RPC框架。其廣泛被應用於阿里集團內部服務以及阿里雲上的服務。該框架通過NIO支持高並發,同時還內置了多種…

    編程 2025-04-29
  • OpenJudge答案1.6的C語言實現

    本文將從多個方面詳細闡述OpenJudge答案1.6在C語言中的實現方法,幫助初學者更好地學習和理解。 一、需求概述 OpenJudge答案1.6的要求是,輸入兩個整數a和b,輸出…

    編程 2025-04-29
  • Python按位運算符和C語言

    本文將從多個方面詳細闡述Python按位運算符和C語言的相關內容,並給出相應的代碼示例。 一、概述 Python是一種動態的、面向對象的編程語言,其按位運算符是用於按位操作的運算符…

    編程 2025-04-29

發表回復

登錄後才能評論