---
# System prepended metadata

title: 說碼解扣-測試工具

---

# 說碼解扣
## 測試工具-minunit
D1211137/貝俊德

# 用途說明：
用c语言编写的极其简单的单元测试框架。使開發人員能夠輕鬆地進行單元測試，幫助確保代碼的可靠性和穩定性。它不使用内存分配，因此在几乎任何情况下都可以正常工作，包括ROMable代码。

# 舉例用途：
![程式測試工具minunit](https://hackmd.io/_uploads/rJSQeMpvp.jpg)
假設你有一個C語言項目，你希望確保這些函數在各種情況下都能正確運作。這時，你可以使用minunit來進行測試，通過創建測試函數，指定預期結果。最終運行整個測試套件，minunit 將報告每個測試的通過與否。
這樣，你可以輕鬆地擴展測試套件，確保你的項目在不同情況下都能正確運作。

# 範例程式碼
```
#include "minunit.h"

static int foo = 0;
static int bar = 0;
static double dbar = 0.1;
static const char* foostring = "Thisstring";

void test_setup(void) {
	foo = 7;
	bar = 4;
}

void test_teardown(void) {
	/* Nothing */
}

MU_TEST(test_check) {
	mu_check(foo == 7);
}

MU_TEST(test_check_fail) {
	mu_check(foo != 7);
}

MU_TEST(test_assert) {
	mu_assert(foo == 7, "foo should be 7");
}

MU_TEST(test_assert_fail) {
	mu_assert(foo != 7, "foo should be <> 7");
}

MU_TEST(test_assert_int_eq) {
	mu_assert_int_eq(4, bar);
}

MU_TEST(test_assert_int_eq_fail) {
	mu_assert_int_eq(5, bar);
}

MU_TEST(test_assert_double_eq) {
	mu_assert_double_eq(0.1, dbar);
}

MU_TEST(test_assert_double_eq_fail) {
	mu_assert_double_eq(0.2, dbar);
}

MU_TEST(test_fail) {
	mu_fail("Fail now!");
}

MU_TEST(test_string_eq){
	mu_assert_string_eq("Thisstring", foostring);
}

MU_TEST(test_string_eq_fail){
	mu_assert_string_eq("Thatstring", foostring);
}


MU_TEST_SUITE(test_suite) {
	MU_SUITE_CONFIGURE(&test_setup, &test_teardown);

	MU_RUN_TEST(test_check);
	MU_RUN_TEST(test_assert);
	MU_RUN_TEST(test_assert_int_eq);
	MU_RUN_TEST(test_assert_double_eq);

	MU_RUN_TEST(test_check_fail);
	MU_RUN_TEST(test_assert_fail);
	MU_RUN_TEST(test_assert_int_eq_fail);
	MU_RUN_TEST(test_assert_double_eq_fail);
	
	MU_RUN_TEST(test_string_eq);
	MU_RUN_TEST(test_string_eq_fail);

	MU_RUN_TEST(test_fail);
}

int main(int argc, char *argv[]) {
	MU_RUN_SUITE(test_suite);
	MU_REPORT();
	return MU_EXIT_CODE;
}
```
# 變數：
1.[foo]和[bar]：兩個整數變數，用於測試二元堆的插入操作。在 test_setup 函數中被初始化，並在測試中使用。
2.[dbar]：一個雙精度浮點數變數，用於測試二元堆的浮點數插入操作。在 test_setup 函數中被初始化，並在測試中使用。
3.[foostring]： 一個指向常數字符的指標，用於測試字符串相等性。在 test_setup 函數中被初始化，並在測試中使用。

# 函式：
1.[test_setup]：在每次測試之前執行的設置函式。它初始化了變數 foo、bar、dbar 和 foostring。
2.[test_teardown]：在每次測試之後執行的拆卸函式。在這個例子中，它什麼也不做。
3.[test_check]:  使用 mu_check 檢查 foo 是否等於 7。
4.[test_check_fail]: 故意失敗，使用 mu_check 檢查 foo 是否不等於 7。
5.[test_asser]:  使用 mu_assert 檢查 foo 是否等於 7，提供自定義的失敗消息。
6.[test_assert_fail]: 故意失敗，使用 mu_assert 斷言 foo 是否等於 7，提供自定義的失敗消息。
7.[test_assert_int_eq]:使用 mu_assert_int_eq 檢查 bar 是否等於 4。
8.[test_assert_int_eq_fail]:故意失敗，使用 mu_assert_int_eq 斷言 bar 是否等於 5。
9.[test_assert_double_eq]:使用 mu_assert_double_eq 檢查 dbar 是否等於 0.1。
10.[test_assert_double_eq_fail]:故意失敗，使用 mu_assert_double_eq 斷言 dbar 是否等於 0.2。
11.[test_fail]:故意失敗，通過呼叫 mu_fail 提供自定義的失敗消息。
12.[test_string_eq]:使用 mu_assert_string_eq 檢查由 foostring 指向的字符串是否等於 "Thisstring"。
13.[test_string_eq_fail]: 故意失敗，使用 mu_assert_string_eq 斷言由 foostring 指向的字符串是否等於 "Thatstring"。
14.[test_suite]：這個函式定義了一個測試套件，並包含了所有的測試函式。它還為整個套件配置了設置和拆卸函式。
15.[main]：主函式運行整個測試套件並生成測試報告。

# 特色：
1. 統一的測試框架： 使用 minunit 提供了一個統一的測試框架，有助於組織和執行測試。測試函式以 MU_TEST 和 MU_TEST_SUITE 定義，而測試套件的配置使用 MU_SUITE_CONFIGURE。
2. 設定和拆卸函式： 透過 test_setup 和 test_teardown 函式，可以在每個測試函式執行之前進行設定（setup）和之後進行拆卸（teardown）。這有助於確保測試的獨立性和可靠性。
3. 基本檢查和斷言： 使用 mu_check 進行基本檢查，而使用 mu_assert 、 mu_assert_int_eq 、 mu_assert_double_eq 、 mu_assert_string_eq 進行斷言。這些檢查和斷言有助於確保測試中的預期條件得到滿足。

4. 測試失敗處理： 透過 mu_fail 函式，可以故意導致測試失敗，這用於確保測試框架能夠正確處理失敗情況。

5. 測試報告： 使用 MU_REPORT 函式生成測試報告，該報告包含有關每個測試的結果，包括通過的測試數量、失敗的測試數量等。

6. 簡短而清晰的主程式： 主程式簡潔，使用 MU_RUN_SUITE 運行整個測試套件，並返回相應的退出碼。這使得測試的執行和報告變得簡單明瞭。

總的來說，minunit 提供了一個輕量、簡單且易於使用的單元測試框架，適用於小型項目或需要快速實施測試的場景。其主要特色包括統一的框架、設定/拆卸函式、基本檢查和斷言、測試失敗處理和清晰的測試報告。

