{"id":13413880,"url":"https://github.com/maxatome/go-testdeep","last_synced_at":"2025-05-15T02:10:14.669Z","repository":{"id":33685945,"uuid":"134971016","full_name":"maxatome/go-testdeep","owner":"maxatome","description":"Extremely flexible golang deep comparison, extends the go testing package, tests HTTP APIs and provides tests suite","archived":false,"fork":false,"pushed_at":"2025-04-10T14:21:31.000Z","size":7042,"stargazers_count":442,"open_issues_count":4,"forks_count":15,"subscribers_count":5,"default_branch":"master","last_synced_at":"2025-04-14T00:59:01.639Z","etag":null,"topics":["assertions","deep-equals","equality","framework","go","golang","golang-package","golang-testing","hacktoberfest","httptest","test-suite","testdeep","testing","tests","testsuite","toolkit","variable-equality"],"latest_commit_sha":null,"homepage":"https://go-testdeep.zetta.rocks/","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-2-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/maxatome.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null},"funding":{"github":["maxatome"]}},"created_at":"2018-05-26T15:03:28.000Z","updated_at":"2025-04-10T14:21:35.000Z","dependencies_parsed_at":"2023-02-18T01:00:39.095Z","dependency_job_id":"910e1d8c-f4cc-4b73-b1aa-b2f605b3fa5a","html_url":"https://github.com/maxatome/go-testdeep","commit_stats":{"total_commits":494,"total_committers":10,"mean_commits":49.4,"dds":0.02429149797570851,"last_synced_commit":"8c9847e83a3ecffa5364cecf6c75f7a859cca108"},"previous_names":[],"tags_count":28,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxatome%2Fgo-testdeep","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxatome%2Fgo-testdeep/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxatome%2Fgo-testdeep/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxatome%2Fgo-testdeep/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/maxatome","download_url":"https://codeload.github.com/maxatome/go-testdeep/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254259386,"owners_count":22040821,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["assertions","deep-equals","equality","framework","go","golang","golang-package","golang-testing","hacktoberfest","httptest","test-suite","testdeep","testing","tests","testsuite","toolkit","variable-equality"],"created_at":"2024-07-30T20:01:51.838Z","updated_at":"2025-05-15T02:10:09.646Z","avatar_url":"https://github.com/maxatome.png","language":"Go","readme":"go-testdeep\n===========\n\n[![Build Status](https://github.com/maxatome/go-testdeep/actions/workflows/ci.yml/badge.svg?branch=master)](https://github.com/maxatome/go-testdeep/actions?query=workflow%3ABuild)\n[![Coverage Status](https://coveralls.io/repos/github/maxatome/go-testdeep/badge.svg?branch=master)](https://coveralls.io/github/maxatome/go-testdeep?branch=master)\n[![Go Report Card](https://goreportcard.com/badge/github.com/maxatome/go-testdeep)](https://goreportcard.com/report/github.com/maxatome/go-testdeep)\n[![GoDoc](https://pkg.go.dev/badge/github.com/maxatome/go-testdeep)](https://pkg.go.dev/github.com/maxatome/go-testdeep/td)\n[![Version](https://img.shields.io/github/tag/maxatome/go-testdeep.svg)](https://github.com/maxatome/go-testdeep/releases)\n[![Mentioned in Awesome Go](https://awesome.re/mentioned-badge.svg)](https://github.com/avelino/awesome-go/#testing)\n\n![go-testdeep](https://github.com/maxatome/go-testdeep-site/raw/master/docs_src/static/images/logo.png)\n\n**Extremely flexible golang deep comparison, extends the go testing package.**\n\nCurrently supports go 1.16 → 1.24.\n\n- [Latest news](#latest-news)\n- [Synopsis](#synopsis)\n- [Description](#description)\n- [Installation](#installation)\n- [Functions](https://go-testdeep.zetta.rocks/functions/)\n- [Available operators](https://go-testdeep.zetta.rocks/operators/)\n- [Helpers](#helpers)\n  - [`tdhttp` or HTTP API testing helper](https://pkg.go.dev/github.com/maxatome/go-testdeep/helpers/tdhttp)\n  - [`tdsuite` or testing suite helper](https://pkg.go.dev/github.com/maxatome/go-testdeep/helpers/tdsuite)\n  - [`tdutil` aka the helper of helpers](https://pkg.go.dev/github.com/maxatome/go-testdeep/helpers/tdutil)\n- [See also](#see-also)\n- [License](#license)\n- [FAQ](https://go-testdeep.zetta.rocks/faq/)\n\n\n## Latest news\n\n- 2023/12/27: [v1.14.0 release](https://github.com/maxatome/go-testdeep/releases/tag/v1.14.0);\n- 2023/03/18: [v1.13.0 release](https://github.com/maxatome/go-testdeep/releases/tag/v1.13.0);\n- 2022/08/07: [v1.12.0 release](https://github.com/maxatome/go-testdeep/releases/tag/v1.12.0);\n- see [commits history](https://github.com/maxatome/go-testdeep/commits/master)\n  for other/older changes.\n\n\n## Synopsis\n\nMake golang tests easy, from simplest usage:\n\n```go\nimport (\n  \"testing\"\n\n  \"github.com/maxatome/go-testdeep/td\"\n)\n\nfunc TestMyFunc(t *testing.T) {\n  td.Cmp(t, MyFunc(), \u0026Info{Name: \"Alice\", Age: 42})\n}\n```\n\nTo a bit more complex one, allowing flexible comparisons using\n[TestDeep operators](https://go-testdeep.zetta.rocks/operators/):\n\n```go\nimport (\n  \"testing\"\n\n  \"github.com/maxatome/go-testdeep/td\"\n)\n\nfunc TestMyFunc(t *testing.T) {\n  td.Cmp(t, MyFunc(), td.Struct(\n    \u0026Info{Name: \"Alice\"},\n    td.StructFields{\n      \"Age\": td.Between(40, 45),\n    },\n  ))\n}\n```\n\nOr anchoring operators directly in literals, as in:\n\n```go\nimport (\n  \"testing\"\n\n  \"github.com/maxatome/go-testdeep/td\"\n)\n\nfunc TestMyFunc(tt *testing.T) {\n  t := td.NewT(tt)\n\n  t.Cmp(MyFunc(), \u0026Info{\n    Name: \"Alice\",\n    Age:  t.Anchor(td.Between(40, 45)).(int),\n  })\n}\n```\n\nTo most complex one, allowing to easily test HTTP API routes, using\nflexible [operators](https://go-testdeep.zetta.rocks/operators/):\n\n```go\nimport (\n  \"testing\"\n  \"time\"\n\n  \"github.com/maxatome/go-testdeep/helpers/tdhttp\"\n  \"github.com/maxatome/go-testdeep/td\"\n)\n\ntype Person struct {\n  ID        uint64    `json:\"id\"`\n  Name      string    `json:\"name\"`\n  Age       int       `json:\"age\"`\n  CreatedAt time.Time `json:\"created_at\"`\n}\n\nfunc TestMyApi(t *testing.T) {\n  var id uint64\n  var createdAt time.Time\n\n  testAPI := tdhttp.NewTestAPI(t, myAPI) // ← ①\n\n  testAPI.PostJSON(\"/person\", Person{Name: \"Bob\", Age: 42}). // ← ②\n    Name(\"Create a new Person\").\n    CmpStatus(http.StatusCreated). // ← ③\n    CmpJSONBody(td.JSON(`\n// Note that comments are allowed\n{\n  \"id\":         $id,             // set by the API/DB\n  \"name\":       \"Alice\",\n  \"age\":        Between(40, 45), // ← ④\n  \"created_at\": \"$createdAt\",    // set by the API/DB\n}`,\n      td.Tag(\"id\", td.Catch(\u0026id, td.NotZero())),        // ← ⑤\n      td.Tag(\"createdAt\", td.All(                       // ← ⑥\n        td.HasSuffix(\"Z\"),                              // ← ⑦\n        td.Smuggle(func(s string) (time.Time, error) {  // ← ⑧\n          return time.Parse(time.RFC3339Nano, s)\n        }, td.Catch(\u0026createdAt, td.Between(testAPI.SentAt(), time.Now()))), // ← ⑨\n      )),\n    ))\n  if !testAPI.Failed() {\n    t.Logf(\"The new Person ID is %d and was created at %s\", id, createdAt)\n  }\n}\n```\n\n1. the API handler ready to be tested;\n2. the POST request with automatic JSON marshalling;\n3. the expected response HTTP status should be `http.StatusCreated`\n   and the line just below, the body should match the [`JSON`] operator;\n4. some operators can be embedded, like [`Between`] here;\n5. for the `$id` placeholder, [`Catch`] its\n   value: put it in `id` variable and check it is [`NotZero`];\n6. for the `$createdAt` placeholder, use the [`All`]\n   operator. It combines several operators like a AND;\n7. check that `$createdAt` date ends with \"Z\" using\n   [`HasSuffix`]. As we expect a RFC3339\n   date, we require it in UTC time zone;\n8. convert `$createdAt` date into a `time.Time` using a custom\n   function thanks to the [`Smuggle`] operator;\n9. then [`Catch`] the resulting value: put it in\n   `createdAt` variable and check it is greater or equal than\n   `testAPI.SentAt()` (the time just before the request is handled) and lesser\n   or equal than `time.Now()`.\n\nSee [`tdhttp`] helper or the\n[FAQ](https://go-testdeep.zetta.rocks/faq/#what-about-testing-the-response-using-my-api)\nfor details about HTTP API testing.\n\nExample of produced error in case of mismatch:\n\n![error output](https://github.com/maxatome/go-testdeep-site/raw/master/docs_src/static/images/colored-output.svg)\n\n\n## Description\n\ngo-testdeep is historically a go rewrite and adaptation of wonderful\n[Test::Deep perl](https://metacpan.org/pod/Test::Deep).\n\nIn golang, comparing data structure is usually done using\n[reflect.DeepEqual](https://golang.org/pkg/reflect/#DeepEqual) or\nusing a package that uses this function behind the scene.\n\nThis function works very well, but it is not flexible. Both compared\nstructures must match exactly and when a difference is returned, it is\nup to the caller to display it. Not easy when comparing big data\nstructures.\n\nThe purpose of go-testdeep, via the\n[`td` package](https://pkg.go.dev/github.com/maxatome/go-testdeep/td)\nand its\n[helpers](https://pkg.go.dev/github.com/maxatome/go-testdeep/helpers),\nis to do its best to introduce this missing flexibility using\n[\"operators\"](https://go-testdeep.zetta.rocks/operators/), when the\nexpected value (or one of its component) cannot be matched exactly,\nmixed with some useful\n[comparison functions](https://go-testdeep.zetta.rocks/functions/).\n\n**See [go-testdeep.zetta.rocks](https://go-testdeep.zetta.rocks/) for\ndetails.**\n\n\n## Installation\n\n```sh\n$ go get github.com/maxatome/go-testdeep\n```\n\n\n## Helpers\n\nThe goal of helpers is to make use of `go-testdeep` even more powerful\nby providing common features using\n[TestDeep operators](https://go-testdeep.zetta.rocks/operators/)\nbehind the scene.\n\n### `tdhttp` or HTTP API testing helper\n\nThe package `github.com/maxatome/go-testdeep/helpers/tdhttp` provides\nsome functions to easily test HTTP handlers.\n\nSee [`tdhttp`] documentation for details or\n[FAQ](https://go-testdeep.zetta.rocks/faq/#what-about-testing-the-response-using-my-api) for an\nexample of use.\n\n### `tdsuite` or testing suite helper\n\nThe package `github.com/maxatome/go-testdeep/helpers/tdsuite` adds tests\nsuite feature to go-testdeep in a non-intrusive way, but easily and powerfully.\n\nA tests suite is a set of tests run sequentially that share some data.\n\nSome hooks can be set to be automatically called before the suite is run,\nbefore, after and/or between each test, and at the end of the suite. \n\nSee [`tdsuite`] documentation for details.\n\n### `tdutil` aka the helper of helpers\n\nThe package `github.com/maxatome/go-testdeep/helpers/tdutil` allows to\nwrite unit tests for go-testdeep helpers and so provides some helpful\nfunctions.\n\nSee\n[`tdutil`](https://pkg.go.dev/github.com/maxatome/go-testdeep/helpers/tdutil)\nfor details.\n\n\n## See also\n\n- [testify](https://github.com/stretchr/testify): a toolkit with common assertions and mocks that plays nicely with the standard library\n- [go-cmp](https://github.com/google/go-cmp): package for comparing Go values in tests\n\n\n## License\n\n`go-testdeep` is released under the BSD-style license found in the\n[`LICENSE`](LICENSE) file in the root directory of this source tree.\n\nInternal function `deepValueEqual` is based on `deepValueEqual` from\n[`reflect` golang package](https://golang.org/pkg/reflect/) licensed\nunder the BSD-style license found in the [`LICENSE` file in the golang\nrepository](https://github.com/golang/go/blob/master/LICENSE).\n\nUses two files (`bypass.go` \u0026 `bypasssafe.go`) from\n[Go-spew](https://github.com/davecgh/go-spew) which is licensed under\nthe [copyfree](http://copyfree.org) ISC License.\n\n[Public Domain Gopher](https://github.com/egonelbre/gophers) provided\nby [Egon Elbre](http://egonelbre.com/). The Go gopher was designed by\n[Renee French](https://reneefrench.blogspot.com/).\n\n\n## FAQ\n\nSee [FAQ](https://go-testdeep.zetta.rocks/faq/).\n\n\n\u003c!-- links:begin --\u003e\n[`T`]: https://pkg.go.dev/github.com/maxatome/go-testdeep/td#T\n[`TestDeep`]: https://pkg.go.dev/github.com/maxatome/go-testdeep/td#TestDeep\n[`Cmp`]: https://pkg.go.dev/github.com/maxatome/go-testdeep/td#Cmp\n\n[`tdhttp`]: https://pkg.go.dev/github.com/maxatome/go-testdeep/helpers/tdhttp\n[`tdsuite`]: https://pkg.go.dev/github.com/maxatome/go-testdeep/helpers/tdsuite\n[`tdutil`]: https://pkg.go.dev/github.com/maxatome/go-testdeep/helpers/tdutil\n\n[`BeLax` config flag]: https://pkg.go.dev/github.com/maxatome/go-testdeep/td#ContextConfig.BeLax\n[`error`]: https://pkg.go.dev/builtin#error\n\n\n[`fmt.Stringer`]: https://pkg.go.dev/fmt/#Stringer\n[`time.Time`]: https://pkg.go.dev/time/#Time\n[`math.NaN`]: https://pkg.go.dev/math/#NaN\n[`All`]: https://go-testdeep.zetta.rocks/operators/all/\n[`Any`]: https://go-testdeep.zetta.rocks/operators/any/\n[`Array`]: https://go-testdeep.zetta.rocks/operators/array/\n[`ArrayEach`]: https://go-testdeep.zetta.rocks/operators/arrayeach/\n[`Bag`]: https://go-testdeep.zetta.rocks/operators/bag/\n[`Between`]: https://go-testdeep.zetta.rocks/operators/between/\n[`Cap`]: https://go-testdeep.zetta.rocks/operators/cap/\n[`Catch`]: https://go-testdeep.zetta.rocks/operators/catch/\n[`Code`]: https://go-testdeep.zetta.rocks/operators/code/\n[`Contains`]: https://go-testdeep.zetta.rocks/operators/contains/\n[`ContainsKey`]: https://go-testdeep.zetta.rocks/operators/containskey/\n[`Delay`]: https://go-testdeep.zetta.rocks/operators/delay/\n[`Empty`]: https://go-testdeep.zetta.rocks/operators/empty/\n[`ErrorIs`]: https://go-testdeep.zetta.rocks/operators/erroris/\n[`First`]: https://go-testdeep.zetta.rocks/operators/first/\n[`Grep`]: https://go-testdeep.zetta.rocks/operators/grep/\n[`Gt`]: https://go-testdeep.zetta.rocks/operators/gt/\n[`Gte`]: https://go-testdeep.zetta.rocks/operators/gte/\n[`HasPrefix`]: https://go-testdeep.zetta.rocks/operators/hasprefix/\n[`HasSuffix`]: https://go-testdeep.zetta.rocks/operators/hassuffix/\n[`Ignore`]: https://go-testdeep.zetta.rocks/operators/ignore/\n[`Isa`]: https://go-testdeep.zetta.rocks/operators/isa/\n[`JSON`]: https://go-testdeep.zetta.rocks/operators/json/\n[`JSONPointer`]: https://go-testdeep.zetta.rocks/operators/jsonpointer/\n[`Keys`]: https://go-testdeep.zetta.rocks/operators/keys/\n[`Last`]: https://go-testdeep.zetta.rocks/operators/last/\n[`Lax`]: https://go-testdeep.zetta.rocks/operators/lax/\n[`Len`]: https://go-testdeep.zetta.rocks/operators/len/\n[`Lt`]: https://go-testdeep.zetta.rocks/operators/lt/\n[`Lte`]: https://go-testdeep.zetta.rocks/operators/lte/\n[`Map`]: https://go-testdeep.zetta.rocks/operators/map/\n[`MapEach`]: https://go-testdeep.zetta.rocks/operators/mapeach/\n[`N`]: https://go-testdeep.zetta.rocks/operators/n/\n[`NaN`]: https://go-testdeep.zetta.rocks/operators/nan/\n[`Nil`]: https://go-testdeep.zetta.rocks/operators/nil/\n[`None`]: https://go-testdeep.zetta.rocks/operators/none/\n[`Not`]: https://go-testdeep.zetta.rocks/operators/not/\n[`NotAny`]: https://go-testdeep.zetta.rocks/operators/notany/\n[`NotEmpty`]: https://go-testdeep.zetta.rocks/operators/notempty/\n[`NotNaN`]: https://go-testdeep.zetta.rocks/operators/notnan/\n[`NotNil`]: https://go-testdeep.zetta.rocks/operators/notnil/\n[`NotZero`]: https://go-testdeep.zetta.rocks/operators/notzero/\n[`PPtr`]: https://go-testdeep.zetta.rocks/operators/pptr/\n[`Ptr`]: https://go-testdeep.zetta.rocks/operators/ptr/\n[`Re`]: https://go-testdeep.zetta.rocks/operators/re/\n[`ReAll`]: https://go-testdeep.zetta.rocks/operators/reall/\n[`Recv`]: https://go-testdeep.zetta.rocks/operators/recv/\n[`Set`]: https://go-testdeep.zetta.rocks/operators/set/\n[`Shallow`]: https://go-testdeep.zetta.rocks/operators/shallow/\n[`Slice`]: https://go-testdeep.zetta.rocks/operators/slice/\n[`Smuggle`]: https://go-testdeep.zetta.rocks/operators/smuggle/\n[`SStruct`]: https://go-testdeep.zetta.rocks/operators/sstruct/\n[`String`]: https://go-testdeep.zetta.rocks/operators/string/\n[`Struct`]: https://go-testdeep.zetta.rocks/operators/struct/\n[`SubBagOf`]: https://go-testdeep.zetta.rocks/operators/subbagof/\n[`SubJSONOf`]: https://go-testdeep.zetta.rocks/operators/subjsonof/\n[`SubMapOf`]: https://go-testdeep.zetta.rocks/operators/submapof/\n[`SubSetOf`]: https://go-testdeep.zetta.rocks/operators/subsetof/\n[`SuperBagOf`]: https://go-testdeep.zetta.rocks/operators/superbagof/\n[`SuperJSONOf`]: https://go-testdeep.zetta.rocks/operators/superjsonof/\n[`SuperMapOf`]: https://go-testdeep.zetta.rocks/operators/supermapof/\n[`SuperSetOf`]: https://go-testdeep.zetta.rocks/operators/supersetof/\n[`SuperSliceOf`]: https://go-testdeep.zetta.rocks/operators/supersliceof/\n[`Tag`]: https://go-testdeep.zetta.rocks/operators/tag/\n[`TruncTime`]: https://go-testdeep.zetta.rocks/operators/trunctime/\n[`Values`]: https://go-testdeep.zetta.rocks/operators/values/\n[`Zero`]: https://go-testdeep.zetta.rocks/operators/zero/\n\n[`CmpAll`]: https://go-testdeep.zetta.rocks/operators/all/#cmpall-shortcut\n[`CmpAny`]: https://go-testdeep.zetta.rocks/operators/any/#cmpany-shortcut\n[`CmpArray`]: https://go-testdeep.zetta.rocks/operators/array/#cmparray-shortcut\n[`CmpArrayEach`]: https://go-testdeep.zetta.rocks/operators/arrayeach/#cmparrayeach-shortcut\n[`CmpBag`]: https://go-testdeep.zetta.rocks/operators/bag/#cmpbag-shortcut\n[`CmpBetween`]: https://go-testdeep.zetta.rocks/operators/between/#cmpbetween-shortcut\n[`CmpCap`]: https://go-testdeep.zetta.rocks/operators/cap/#cmpcap-shortcut\n[`CmpCode`]: https://go-testdeep.zetta.rocks/operators/code/#cmpcode-shortcut\n[`CmpContains`]: https://go-testdeep.zetta.rocks/operators/contains/#cmpcontains-shortcut\n[`CmpContainsKey`]: https://go-testdeep.zetta.rocks/operators/containskey/#cmpcontainskey-shortcut\n[`CmpEmpty`]: https://go-testdeep.zetta.rocks/operators/empty/#cmpempty-shortcut\n[`CmpErrorIs`]: https://go-testdeep.zetta.rocks/operators/erroris/#cmperroris-shortcut\n[`CmpFirst`]: https://go-testdeep.zetta.rocks/operators/first/#cmpfirst-shortcut\n[`CmpGrep`]: https://go-testdeep.zetta.rocks/operators/grep/#cmpgrep-shortcut\n[`CmpGt`]: https://go-testdeep.zetta.rocks/operators/gt/#cmpgt-shortcut\n[`CmpGte`]: https://go-testdeep.zetta.rocks/operators/gte/#cmpgte-shortcut\n[`CmpHasPrefix`]: https://go-testdeep.zetta.rocks/operators/hasprefix/#cmphasprefix-shortcut\n[`CmpHasSuffix`]: https://go-testdeep.zetta.rocks/operators/hassuffix/#cmphassuffix-shortcut\n[`CmpIsa`]: https://go-testdeep.zetta.rocks/operators/isa/#cmpisa-shortcut\n[`CmpJSON`]: https://go-testdeep.zetta.rocks/operators/json/#cmpjson-shortcut\n[`CmpJSONPointer`]: https://go-testdeep.zetta.rocks/operators/jsonpointer/#cmpjsonpointer-shortcut\n[`CmpKeys`]: https://go-testdeep.zetta.rocks/operators/keys/#cmpkeys-shortcut\n[`CmpLast`]: https://go-testdeep.zetta.rocks/operators/last/#cmplast-shortcut\n[`CmpLax`]: https://go-testdeep.zetta.rocks/operators/lax/#cmplax-shortcut\n[`CmpLen`]: https://go-testdeep.zetta.rocks/operators/len/#cmplen-shortcut\n[`CmpLt`]: https://go-testdeep.zetta.rocks/operators/lt/#cmplt-shortcut\n[`CmpLte`]: https://go-testdeep.zetta.rocks/operators/lte/#cmplte-shortcut\n[`CmpMap`]: https://go-testdeep.zetta.rocks/operators/map/#cmpmap-shortcut\n[`CmpMapEach`]: https://go-testdeep.zetta.rocks/operators/mapeach/#cmpmapeach-shortcut\n[`CmpN`]: https://go-testdeep.zetta.rocks/operators/n/#cmpn-shortcut\n[`CmpNaN`]: https://go-testdeep.zetta.rocks/operators/nan/#cmpnan-shortcut\n[`CmpNil`]: https://go-testdeep.zetta.rocks/operators/nil/#cmpnil-shortcut\n[`CmpNone`]: https://go-testdeep.zetta.rocks/operators/none/#cmpnone-shortcut\n[`CmpNot`]: https://go-testdeep.zetta.rocks/operators/not/#cmpnot-shortcut\n[`CmpNotAny`]: https://go-testdeep.zetta.rocks/operators/notany/#cmpnotany-shortcut\n[`CmpNotEmpty`]: https://go-testdeep.zetta.rocks/operators/notempty/#cmpnotempty-shortcut\n[`CmpNotNaN`]: https://go-testdeep.zetta.rocks/operators/notnan/#cmpnotnan-shortcut\n[`CmpNotNil`]: https://go-testdeep.zetta.rocks/operators/notnil/#cmpnotnil-shortcut\n[`CmpNotZero`]: https://go-testdeep.zetta.rocks/operators/notzero/#cmpnotzero-shortcut\n[`CmpPPtr`]: https://go-testdeep.zetta.rocks/operators/pptr/#cmppptr-shortcut\n[`CmpPtr`]: https://go-testdeep.zetta.rocks/operators/ptr/#cmpptr-shortcut\n[`CmpRe`]: https://go-testdeep.zetta.rocks/operators/re/#cmpre-shortcut\n[`CmpReAll`]: https://go-testdeep.zetta.rocks/operators/reall/#cmpreall-shortcut\n[`CmpRecv`]: https://go-testdeep.zetta.rocks/operators/recv/#cmprecv-shortcut\n[`CmpSet`]: https://go-testdeep.zetta.rocks/operators/set/#cmpset-shortcut\n[`CmpShallow`]: https://go-testdeep.zetta.rocks/operators/shallow/#cmpshallow-shortcut\n[`CmpSlice`]: https://go-testdeep.zetta.rocks/operators/slice/#cmpslice-shortcut\n[`CmpSmuggle`]: https://go-testdeep.zetta.rocks/operators/smuggle/#cmpsmuggle-shortcut\n[`CmpSStruct`]: https://go-testdeep.zetta.rocks/operators/sstruct/#cmpsstruct-shortcut\n[`CmpString`]: https://go-testdeep.zetta.rocks/operators/string/#cmpstring-shortcut\n[`CmpStruct`]: https://go-testdeep.zetta.rocks/operators/struct/#cmpstruct-shortcut\n[`CmpSubBagOf`]: https://go-testdeep.zetta.rocks/operators/subbagof/#cmpsubbagof-shortcut\n[`CmpSubJSONOf`]: https://go-testdeep.zetta.rocks/operators/subjsonof/#cmpsubjsonof-shortcut\n[`CmpSubMapOf`]: https://go-testdeep.zetta.rocks/operators/submapof/#cmpsubmapof-shortcut\n[`CmpSubSetOf`]: https://go-testdeep.zetta.rocks/operators/subsetof/#cmpsubsetof-shortcut\n[`CmpSuperBagOf`]: https://go-testdeep.zetta.rocks/operators/superbagof/#cmpsuperbagof-shortcut\n[`CmpSuperJSONOf`]: https://go-testdeep.zetta.rocks/operators/superjsonof/#cmpsuperjsonof-shortcut\n[`CmpSuperMapOf`]: https://go-testdeep.zetta.rocks/operators/supermapof/#cmpsupermapof-shortcut\n[`CmpSuperSetOf`]: https://go-testdeep.zetta.rocks/operators/supersetof/#cmpsupersetof-shortcut\n[`CmpSuperSliceOf`]: https://go-testdeep.zetta.rocks/operators/supersliceof/#cmpsupersliceof-shortcut\n[`CmpTruncTime`]: https://go-testdeep.zetta.rocks/operators/trunctime/#cmptrunctime-shortcut\n[`CmpValues`]: https://go-testdeep.zetta.rocks/operators/values/#cmpvalues-shortcut\n[`CmpZero`]: https://go-testdeep.zetta.rocks/operators/zero/#cmpzero-shortcut\n\n[`T.All`]: https://go-testdeep.zetta.rocks/operators/all/#tall-shortcut\n[`T.Any`]: https://go-testdeep.zetta.rocks/operators/any/#tany-shortcut\n[`T.Array`]: https://go-testdeep.zetta.rocks/operators/array/#tarray-shortcut\n[`T.ArrayEach`]: https://go-testdeep.zetta.rocks/operators/arrayeach/#tarrayeach-shortcut\n[`T.Bag`]: https://go-testdeep.zetta.rocks/operators/bag/#tbag-shortcut\n[`T.Between`]: https://go-testdeep.zetta.rocks/operators/between/#tbetween-shortcut\n[`T.Cap`]: https://go-testdeep.zetta.rocks/operators/cap/#tcap-shortcut\n[`T.Code`]: https://go-testdeep.zetta.rocks/operators/code/#tcode-shortcut\n[`T.Contains`]: https://go-testdeep.zetta.rocks/operators/contains/#tcontains-shortcut\n[`T.ContainsKey`]: https://go-testdeep.zetta.rocks/operators/containskey/#tcontainskey-shortcut\n[`T.Empty`]: https://go-testdeep.zetta.rocks/operators/empty/#tempty-shortcut\n[`T.CmpErrorIs`]: https://go-testdeep.zetta.rocks/operators/erroris/#tcmperroris-shortcut\n[`T.First`]: https://go-testdeep.zetta.rocks/operators/first/#tfirst-shortcut\n[`T.Grep`]: https://go-testdeep.zetta.rocks/operators/grep/#tgrep-shortcut\n[`T.Gt`]: https://go-testdeep.zetta.rocks/operators/gt/#tgt-shortcut\n[`T.Gte`]: https://go-testdeep.zetta.rocks/operators/gte/#tgte-shortcut\n[`T.HasPrefix`]: https://go-testdeep.zetta.rocks/operators/hasprefix/#thasprefix-shortcut\n[`T.HasSuffix`]: https://go-testdeep.zetta.rocks/operators/hassuffix/#thassuffix-shortcut\n[`T.Isa`]: https://go-testdeep.zetta.rocks/operators/isa/#tisa-shortcut\n[`T.JSON`]: https://go-testdeep.zetta.rocks/operators/json/#tjson-shortcut\n[`T.JSONPointer`]: https://go-testdeep.zetta.rocks/operators/jsonpointer/#tjsonpointer-shortcut\n[`T.Keys`]: https://go-testdeep.zetta.rocks/operators/keys/#tkeys-shortcut\n[`T.Last`]: https://go-testdeep.zetta.rocks/operators/last/#tlast-shortcut\n[`T.CmpLax`]: https://go-testdeep.zetta.rocks/operators/lax/#tcmplax-shortcut\n[`T.Len`]: https://go-testdeep.zetta.rocks/operators/len/#tlen-shortcut\n[`T.Lt`]: https://go-testdeep.zetta.rocks/operators/lt/#tlt-shortcut\n[`T.Lte`]: https://go-testdeep.zetta.rocks/operators/lte/#tlte-shortcut\n[`T.Map`]: https://go-testdeep.zetta.rocks/operators/map/#tmap-shortcut\n[`T.MapEach`]: https://go-testdeep.zetta.rocks/operators/mapeach/#tmapeach-shortcut\n[`T.N`]: https://go-testdeep.zetta.rocks/operators/n/#tn-shortcut\n[`T.NaN`]: https://go-testdeep.zetta.rocks/operators/nan/#tnan-shortcut\n[`T.Nil`]: https://go-testdeep.zetta.rocks/operators/nil/#tnil-shortcut\n[`T.None`]: https://go-testdeep.zetta.rocks/operators/none/#tnone-shortcut\n[`T.Not`]: https://go-testdeep.zetta.rocks/operators/not/#tnot-shortcut\n[`T.NotAny`]: https://go-testdeep.zetta.rocks/operators/notany/#tnotany-shortcut\n[`T.NotEmpty`]: https://go-testdeep.zetta.rocks/operators/notempty/#tnotempty-shortcut\n[`T.NotNaN`]: https://go-testdeep.zetta.rocks/operators/notnan/#tnotnan-shortcut\n[`T.NotNil`]: https://go-testdeep.zetta.rocks/operators/notnil/#tnotnil-shortcut\n[`T.NotZero`]: https://go-testdeep.zetta.rocks/operators/notzero/#tnotzero-shortcut\n[`T.PPtr`]: https://go-testdeep.zetta.rocks/operators/pptr/#tpptr-shortcut\n[`T.Ptr`]: https://go-testdeep.zetta.rocks/operators/ptr/#tptr-shortcut\n[`T.Re`]: https://go-testdeep.zetta.rocks/operators/re/#tre-shortcut\n[`T.ReAll`]: https://go-testdeep.zetta.rocks/operators/reall/#treall-shortcut\n[`T.Recv`]: https://go-testdeep.zetta.rocks/operators/recv/#trecv-shortcut\n[`T.Set`]: https://go-testdeep.zetta.rocks/operators/set/#tset-shortcut\n[`T.Shallow`]: https://go-testdeep.zetta.rocks/operators/shallow/#tshallow-shortcut\n[`T.Slice`]: https://go-testdeep.zetta.rocks/operators/slice/#tslice-shortcut\n[`T.Smuggle`]: https://go-testdeep.zetta.rocks/operators/smuggle/#tsmuggle-shortcut\n[`T.SStruct`]: https://go-testdeep.zetta.rocks/operators/sstruct/#tsstruct-shortcut\n[`T.String`]: https://go-testdeep.zetta.rocks/operators/string/#tstring-shortcut\n[`T.Struct`]: https://go-testdeep.zetta.rocks/operators/struct/#tstruct-shortcut\n[`T.SubBagOf`]: https://go-testdeep.zetta.rocks/operators/subbagof/#tsubbagof-shortcut\n[`T.SubJSONOf`]: https://go-testdeep.zetta.rocks/operators/subjsonof/#tsubjsonof-shortcut\n[`T.SubMapOf`]: https://go-testdeep.zetta.rocks/operators/submapof/#tsubmapof-shortcut\n[`T.SubSetOf`]: https://go-testdeep.zetta.rocks/operators/subsetof/#tsubsetof-shortcut\n[`T.SuperBagOf`]: https://go-testdeep.zetta.rocks/operators/superbagof/#tsuperbagof-shortcut\n[`T.SuperJSONOf`]: https://go-testdeep.zetta.rocks/operators/superjsonof/#tsuperjsonof-shortcut\n[`T.SuperMapOf`]: https://go-testdeep.zetta.rocks/operators/supermapof/#tsupermapof-shortcut\n[`T.SuperSetOf`]: https://go-testdeep.zetta.rocks/operators/supersetof/#tsupersetof-shortcut\n[`T.SuperSliceOf`]: https://go-testdeep.zetta.rocks/operators/supersliceof/#tsupersliceof-shortcut\n[`T.TruncTime`]: https://go-testdeep.zetta.rocks/operators/trunctime/#ttrunctime-shortcut\n[`T.Values`]: https://go-testdeep.zetta.rocks/operators/values/#tvalues-shortcut\n[`T.Zero`]: https://go-testdeep.zetta.rocks/operators/zero/#tzero-shortcut\n\u003c!-- links:end --\u003e\n","funding_links":["https://github.com/sponsors/maxatome"],"categories":["Template Engines","开源类库","Testing","测试","Open source library","测试相关`测试库和测试数据集生成库`","Testing Frameworks","测试相关","Go"],"sub_categories":["Testing Frameworks","开发辅助包","HTTP客户端","HTTP Clients","Development Aid Package","交流","查询语"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmaxatome%2Fgo-testdeep","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmaxatome%2Fgo-testdeep","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmaxatome%2Fgo-testdeep/lists"}