<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                [TOC] ## <span style="font-size:15px">**一、安裝**</span> ``` go get github.com/smartystreets/goconvey ``` 官方文檔: https://github.com/smartystreets/goconvey/wiki/Documentation https://pkg.go.dev/github.com/smartystreets/goconvey@v1.8.1/convey#pkg-overview ## <span style="font-size:15px">**二、庫函數說明**</span> | 庫函數 | 說明 | | --- | --- | | Convey(items ...interface{}) | Convey是用于聲明的作用域時使用的方法,每個作用域都有一個描述和一個func(),其中可能包含對Convey()、Reset()或Should樣式斷言的其他調用。 | | FocusConvey(items ...any) | FocusConvey 函數用于標記一個測試函數,使其成為焦點測試。當運行測試套件時,只有被標記為焦點的測試函數會被運行。 | | SkipConvey(items ...interface{}) |對應的閉包函數將不被執行。 | | So(actual interface{}, assert Assertion, expected ...interface{}) | 在測試中進行斷言。它的作用是比較實際值(actual)和期望值(expected),并根據斷言(assert)的結果來判斷測試是否通過。 | | SoMsg(msg string, actual interface{}, assert Assertion, expected ...interface{}) | 用于在測試中進行斷言。它的作用是比較實際值和期望值,并根據斷言結果輸出相應的測試信息(msg) | | SkipSo(stuff ...interface{}) | 用于在測試中跳過特定的斷言。當測試中的某些條件不滿足時,可以使用 SkipSo 函數來跳過對應的斷言,使得測試繼續執行而不會因為特定條件的失敗而中斷。這樣可以讓測試在某些情況下繼續執行,同時記錄下跳過的斷言,方便后續分析和調試。 | | Reset(action func()) | Reset注冊一個清理函數,該函數將在同一作用域中的每個Convey()之后運行 | | Println(items ...interface{}) (int, error) | 打印日志,類似于fmt | | Print(items ...interface{}) (int, error) | 打印日志,類似于fmt | | Printf(format string, items ...interface{}) (int, error) | 打印日志,類似于fmt | | SetDefaultFailureMode(mode FailureMode) | 用于設置默認的測試失敗模式。參數 mode 是一個枚舉類型 FailureMode,用于表示測試失敗時的行為,包括 FailureHalts(默認行為,測試失敗會導致測試停止)和 FailureContinues(測試失敗不會停止,繼續執行其他測試) | | SetDefaultStackMode(mode StackMode) | 用于設置默認的堆棧模式。該函數接受一個 StackMode 類型的參數,并將默認的堆棧模式設置為指定的模式。 | | SuppressConsoleStatistics() | SuppressConsoleStatistics阻止控制臺統計信息的自動打印。顯式調用PrintConsoleStatistics將強制打印統計數據。 | | PrintConsoleStatistics() | 打印斷言統計數據 | ## <span style="font-size:15px">**三、標準斷言**</span> ### <span style="font-size:15px">**1、通用相等比較**</span> ``` So(thing1, ShouldEqual, thing2) // 相等 So(thing1, ShouldNotEqual, thing2) // 不相等 ``` ### <span style="font-size:15px">**2、深度比較:數組、切片、map和結構體**</span> ``` So(thing1, ShouldResemble, thing2) // 斷言 thing1 應該與 thing2 相似。相似性的判斷是通過比較兩個對象的值來確定的 So(thing1, ShouldNotResemble, thing2) // 斷言 thing1 與 thing2 不相似。 So(thing1, ShouldPointTo, thing2) // 斷言 thing1 應該指向 thing2。這通常用于檢查指針是否指向了正確的對象。 So(thing1, ShouldNotPointTo, thing2) // 斷言 thing1 不應該指向 thing2。 So(thing1, ShouldBeNil) // 斷言 thing1 應該為 nil,即空值。 So(thing1, ShouldNotBeNil) // 斷言 thing1 不應該為 nil。 So(thing1, ShouldBeTrue) // 斷言 thing1 應該為True。 So(thing1, ShouldBeFalse) // 斷言 thing1 應該為False So(thing1, ShouldBeZeroValue) // 斷言 thing1 應該為其類型的零值。這通常用于檢查變量是否被正確初始化為零值。 ``` ### <span style="font-size:15px">**3、數值比較**</span> ``` So(1, ShouldBeGreaterThan, 0) // 斷言驗證1是否大于0。 So(1, ShouldBeGreaterThanOrEqualTo, 0) // 斷言驗證1是否大于或等于0。 So(1, ShouldBeLessThan, 2) // 斷言驗證1是否小于2。 So(1, ShouldBeLessThanOrEqualTo, 2) // 斷言驗證1是否小于或等于2。 So(1.1, ShouldBeBetween, .8, 1.2) // 斷言驗證1.1是否在0.8和1.2之間。 So(1.1, ShouldNotBeBetween, 2, 3) // 斷言驗證1.1是否不在2和3之間。 So(1.1, ShouldBeBetweenOrEqual, .9, 1.1) // 斷言驗證1.1是否在0.9和1.1之間,包括邊界值。 So(1.1, ShouldNotBeBetweenOrEqual, 1000, 2000) // 斷言驗證1.1是否不在1000和2000之間,包括邊界值。 So(1.0, ShouldAlmostEqual, 0.99999999, .0001) // 斷言驗證1.0是否近似等于0.99999999,允許的誤差為0.0001。 So(1.0, ShouldNotAlmostEqual, 0.9, .0001) // 斷言驗證1.0是否不近似等于0.9,允許的誤差為0.0001。 ``` ### <span style="font-size:15px">**4、數據集合比較**</span> ``` So([]int{2, 4, 6}, ShouldContain, 4) // 斷言切片[]int{2, 4, 6}中包含元素4。 So([]int{2, 4, 6}, ShouldNotContain, 5) // 斷言切片[]int{2, 4, 6}中不包含元素5。 So(4, ShouldBeIn, ...[]int{2, 4, 6}) // 斷言元素4存在于切片[]int{2, 4, 6}中。 So(4, ShouldNotBeIn, ...[]int{1, 3, 5}) // 斷言元素4不存在于切片[]int{1, 3, 5}中。 So([]int{}, ShouldBeEmpty) // 斷言空切片 So([]int{1}, ShouldNotBeEmpty) // 斷言切片不為空 So(map[string]string{"a": "b"}, ShouldContainKey, "a") // 斷言map中包含鍵a So(map[string]string{"a": "b"}, ShouldNotContainKey, "b") // 斷言map中不包含鍵b So(map[string]string{"a": "b"}, ShouldNotBeEmpty) // 斷言非空map So(map[string]string{}, ShouldBeEmpty) // 斷言空map So(map[string]string{"a": "b"}, ShouldHaveLength, 1) // 斷言map的長度為1 ``` ### <span style="font-size:15px">**5、字符串比較**</span> ``` So("asdf", ShouldStartWith, "as") // 斷言"asdf"應該以"as"開頭 So("asdf", ShouldNotStartWith, "df") // 斷言"asdf"不應該以"df"開頭 So("asdf", ShouldEndWith, "df") // 斷言"asdf"應該以"df"結尾 So("asdf", ShouldNotEndWith, "df") // 斷言"asdf"不應該以"df"結尾 So("asdf", ShouldContainSubstring, "sd") // 斷言"asdf"應該包含子串"sd" So("asdf", ShouldNotContainSubstring, "er") // 斷言"asdf"不應該包含子串"er" So("adsf", ShouldBeBlank) // 斷言"adsf"應該為空白字符串 So("asdf", ShouldNotBeBlank) // 斷言"asdf"不應該是空白字符串 ``` ### <span style="font-size:15px">**6、異常比較**</span> ``` So(func(), ShouldPanic) // 用于測試一個函數是否會觸發panic,觸發則通過 So(func(), ShouldNotPanic) // 用于測試一個函數是否不會觸發panic,不觸發則通過 So(func(), ShouldPanicWith, "") // 用于測試一個函數觸發恐慌時的恐慌信息。如果 func() 執行時觸發了恐慌,并且恐慌信息與提供的字符串匹配,這個斷言會通過測試;否則測試將失敗。也可以使用 errors.New("something") 作為期望的恐慌信息 So(func(), ShouldNotPanicWith, "") // 用于測試一個函數觸發恐慌時的恐慌信息。如果 func() 執行時沒有觸發恐慌,或者觸發了恐慌但恐慌信息與提供的字符串不匹配,這個斷言會通過測試;如果觸發了恐慌且恐慌信息與提供的字符串匹配,測試將失敗。也可以使用 errors.New("something") 作為不期望的恐慌信息。 ``` ### <span style="font-size:15px">**7、類型檢查**</span> ``` So(1, ShouldHaveSameTypeAs, 0) // 檢查 1 的類型是否與 0 的類型相同 So(1, ShouldNotHaveSameTypeAs, "asdf") // 檢查 1 的類型是否與字符串 "asdf" 的類型不同 ``` ### <span style="font-size:15px">**8、時間比較**</span> ``` So(time.Now(), ShouldHappenBefore, time.Now()) // 斷言第一個時間應該在第二個時間之前 So(time.Now(), ShouldHappenOnOrBefore, time.Now()) // 斷言第一個時間應該等于或在第二個時間之前 So(time.Now(), ShouldHappenAfter, time.Now()) // 斷言第一個時間應該在第二個時間之后 So(time.Now(), ShouldHappenOnOrAfter, time.Now()) // 斷言第一個時間應該等于或在第二個時間之后 So(time.Now(), ShouldHappenBetween, time.Now(), time.Now()) // 斷言第一個時間應該在第二個和第三個時間之間 So(time.Now(), ShouldHappenOnOrBetween, time.Now(), time.Now()) // 斷言第一個時間應該等于或在第二個和第三個時間之間 So(time.Now(), ShouldNotHappenOnOrBetween, time.Now(), time.Now()) // 斷言第一個時間不應該等于或在第二個和第三個時間之間 So(time.Now(), ShouldHappenWithin, duration, time.Now()) // 斷言第一個時間應該在第二個時間之前指定的持續時間范圍內 So(time.Now(), ShouldNotHappenWithin, duration, time.Now()) // 斷言第一個時間不應該在第二個時間之前指定的持續時間范圍內 ``` ## <span style="font-size:15px">**四、自定義斷言**</span> 框架支持自定義函數進行斷言內容的封裝,然后在So()函數中進行調用 ``` func shouldScareGophersMoreThan(actual interface{}, expected ...interface{}) string { if actual == "BOO!" && expected[0] == "boo" { return "" } return "assert failed" } func TestSummer(t *testing.T) { Convey("custom assert", func() { So("BOO!", shouldScareGophersMoreThan, "boo") }) } ``` ## <span style="font-size:15px">**五、用例編寫**</span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;單元測試的名稱需以?Test?開頭,并需要接收一個類型為?\*testing.T?的參數。 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;每個測試用例需要使用Convey函數包裹起來,第一個參數為string類型的測試用例描述;第二個參數一般為?\*testing.T;第三個參數為不接收任何參數也不返回任何值的函數(通常以閉包的形式書寫)。Convey語句可以無限嵌套,以體現各個測試用例之間的關系,只有最外層的?Convey?需要傳入\*testing.T類型變量,內層嵌套的Convey不需要傳入。 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;當存在SkipConvey或SkipSo時,測試日志中會顯式打上"skipped"形式的標記: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;當測試代碼中存在SkipConvey時,相應閉包函數中不管是否為SkipSo,都將被忽略,測試日志中對應的符號僅為一個"?" &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;當測試代碼Convey語句中存在SkipSo時,測試日志中每個So對應一個"?"或"?",每個SkipSo對應一個"?",按實際順序排列 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;不管存在SkipConvey還是SkipSo時,測試日志中都有字符串"{n} total assertions (one or more sections skipped)",其中{n}表示測試中實際已運行的斷言語句數。 ``` package operate import ( . "github.com/smartystreets/goconvey/convey" "testing" ) func Add(a, b int) int { return a + b } func Subtract(a, b int) int { return a - b } func TestAdd(t *testing.T) { Convey("將兩數相加", t, func() { So(Add(1, 2), ShouldEqual, 3) }) } func TestOperate(t *testing.T) { Convey("數值操作", t, func() { Convey("將兩數相加", func() { So(Add(1, 2), ShouldEqual, 3) }) SkipConvey("將兩數相減", func() { // 跳過測試 So(Subtract(2, 1), ShouldEqual, 1) }) }) } func TestFocusOperate(t *testing.T) { Convey("將兩數相減", t, func() { So(Subtract(2, 1), ShouldEqual, 1) }) FocusConvey("聚焦操作", t, func() { Convey("此用例不會執行", func() { So(Add(1, 2), ShouldEqual, 3) }) FocusConvey("只執行這用例", func() { So(Add(2, 2), ShouldEqual, 4) }) }) } ``` 運行結果: ``` === RUN TestAdd 將兩數相加 ? 1 total assertion --- PASS: TestAdd (0.00s) === RUN TestOperate 數值操作 將兩數相加 ? 將兩數相減 ? 2 total assertions (one or more sections skipped) --- PASS: TestOperate (0.00s) === RUN TestFocusOperate 將兩數相減 ? 3 total assertions (one or more sections skipped) 聚焦操作 只執行這用例 ? 4 total assertions (one or more sections skipped) --- PASS: TestFocusOperate (0.00s) PASS ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看