{"id":15199464,"url":"https://github.com/google/googletest-rust","last_synced_at":"2026-04-06T00:05:17.112Z","repository":{"id":64506783,"uuid":"555410042","full_name":"google/googletest-rust","owner":"google","description":"A unit testing library which provides rich assertions, fixtures, and other advanced testing features. Inspired by Google's C++ testing library googletest.","archived":false,"fork":false,"pushed_at":"2025-09-24T17:21:57.000Z","size":1564,"stargazers_count":382,"open_issues_count":19,"forks_count":25,"subscribers_count":7,"default_branch":"main","last_synced_at":"2025-09-25T04:37:26.078Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://docs.rs/googletest/latest/googletest/","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/google.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"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,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2022-10-21T14:20:24.000Z","updated_at":"2025-09-22T16:18:14.000Z","dependencies_parsed_at":"2023-10-10T19:29:33.969Z","dependency_job_id":"0dac8dc7-f177-42d7-a618-1d332a44841a","html_url":"https://github.com/google/googletest-rust","commit_stats":{"total_commits":164,"total_committers":6,"mean_commits":"27.333333333333332","dds":"0.16463414634146345","last_synced_commit":"ff30663b279fbc7b7435c7f67a602aaf5ffc2526"},"previous_names":[],"tags_count":18,"template":false,"template_full_name":null,"purl":"pkg:github/google/googletest-rust","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/google%2Fgoogletest-rust","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/google%2Fgoogletest-rust/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/google%2Fgoogletest-rust/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/google%2Fgoogletest-rust/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/google","download_url":"https://codeload.github.com/google/googletest-rust/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/google%2Fgoogletest-rust/sbom","scorecard":{"id":481958,"data":{"date":"2025-08-19T12:18:39Z","repo":{"name":"github.com/google/googletest-rust","commit":"348374bff2c5a7b8334b82a70736a6676aea9309"},"scorecard":{"version":"v5.2.1","commit":"ab2f6e92482462fe66246d9e32f642855a691dc1"},"score":7.7,"checks":[{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#dangerous-workflow"}},{"name":"Dependency-Update-Tool","score":10,"reason":"update tool detected","details":["Info: detected update tool: Dependabot: .github/dependabot.yml:1"],"documentation":{"short":"Determines if the project uses a dependency update tool.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#dependency-update-tool"}},{"name":"Token-Permissions","score":10,"reason":"GitHub workflow tokens follow principle of least privilege","details":["Info: jobLevel 'contents' permission set to 'read': .github/workflows/ci.yml:24","Warn: jobLevel 'checks' permission set to 'write': .github/workflows/ci.yml:25","Info: topLevel permissions set to 'read-all': .github/workflows/ci.yml:13","Info: topLevel permissions set to 'read-all': .github/workflows/publish.yml:7","Info: topLevel permissions set to 'read-all': .github/workflows/scorecard.yml:18"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#token-permissions"}},{"name":"Code-Review","score":0,"reason":"Found 1/11 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#code-review"}},{"name":"Maintained","score":10,"reason":"30 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#maintained"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#binary-artifacts"}},{"name":"Pinned-Dependencies","score":10,"reason":"all dependencies are pinned","details":["Info:  13 out of  13 GitHub-owned GitHubAction dependencies pinned","Info:  10 out of  10 third-party GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":2,"reason":"badge detected: InProgress","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#cii-best-practices"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#vulnerabilities"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 30 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#sast"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: Apache License 2.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#license"}},{"name":"Packaging","score":10,"reason":"packaging workflow detected","details":["Info: Project packages its releases by way of GitHub Actions.: .github/workflows/publish.yml:13"],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#packaging"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#fuzzing"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#branch-protection"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#signed-releases"}},{"name":"Security-Policy","score":10,"reason":"security policy file detected","details":["Info: security policy file detected: github.com/google/.github/SECURITY.md:1","Info: Found linked content: github.com/google/.github/SECURITY.md:1","Info: Found disclosure, vulnerability, and/or timelines in security policy: github.com/google/.github/SECURITY.md:1","Info: Found text in security policy: github.com/google/.github/SECURITY.md:1"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#security-policy"}},{"name":"CI-Tests","score":9,"reason":"19 out of 20 merged PRs checked by a CI test -- score normalized to 9","details":null,"documentation":{"short":"Determines if the project runs tests before pull requests are merged.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#ci-tests"}},{"name":"Contributors","score":6,"reason":"project has 2 contributing companies or organizations -- score normalized to 6","details":["Info: found contributions from: Singular, google"],"documentation":{"short":"Determines if the project has a set of contributors from multiple organizations (e.g., companies).","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#contributors"}}]},"last_synced_at":"2025-08-19T16:52:18.699Z","repository_id":64506783,"created_at":"2025-08-19T16:52:18.700Z","updated_at":"2025-08-19T16:52:18.700Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":276997539,"owners_count":25742466,"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","status":"online","status_checked_at":"2025-09-25T02:00:09.612Z","response_time":80,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":[],"created_at":"2024-09-28T02:01:11.374Z","updated_at":"2025-10-02T15:30:19.227Z","avatar_url":"https://github.com/google.png","language":"Rust","readme":"# GoogleTest Rust\n\n[![crates.io][crates-badge]][crates-url]\n[![docs.rs][docs-badge]][docs-url]\n[![Apache licensed][license-badge]][license-url]\n[![Build Status][actions-badge]][actions-url]\n[![OpenSSF Best Practices][openssf-badge]][openssf-url]\n\n[crates-badge]: https://img.shields.io/crates/v/googletest.svg\n[crates-url]: https://crates.io/crates/googletest\n[docs-badge]: https://img.shields.io/badge/docs.rs-googletest-66c2a5\n[docs-url]: https://docs.rs/googletest/*/googletest/\n[license-badge]: https://img.shields.io/badge/license-Apache-blue.svg\n[license-url]: https://github.com/google/googletest-rust/blob/main/LICENSE\n[actions-badge]: https://github.com/google/googletest-rust/workflows/CI/badge.svg\n[actions-url]: https://github.com/google/googletest-rust/actions?query=workflow%3ACI+branch%3Amain\n[openssf-badge]: https://www.bestpractices.dev/projects/10037/badge\n[openssf-url]: https://www.bestpractices.dev/projects/10037\n\nThis library brings the rich assertion types of Google's C++ testing library\n[GoogleTest](https://github.com/google/googletest) to Rust. It provides:\n\n * A framework for writing matchers which can be combined to make a wide range\n   of assertions on data,\n * A rich set of matchers providing similar functionality to those included in\n   [GoogleTest](https://google.github.io/googletest/reference/matchers.html),\n   and\n * A new set of assertion macros offering similar functionality to those of\n   [GoogleTest](https://google.github.io/googletest/primer.html#assertions).\n\n**The minimum supported Rust version is 1.85**.\n\n\u003e :warning: The API is not fully stable and may still be changed until we\n\u003e publish version 1.0.\n\u003e\n\u003e Moreover, any items or modules starting with `__` (double underscores) must\n\u003e not be used directly. Those items or modules are only for internal uses and\n\u003e their API may change without a major version update.\n\n## Learning resources\n\nIf you're just getting started with `googletest`, consider going through\nthe first chapter of\n[\"Advanced testing for Rust applications\"](https://github.com/mainmatter/rust-advanced-testing-workshop),\na self-guided Rust course: it provides a guided introduction to the library,\nwith exercises to help you get comfortable with `googletest` macros,\nits matchers and its overall philosophy.\n\n## Assertions and matchers\n\nThe core of GoogleTest is its *matchers*. Matchers indicate what aspect of an\nactual value one is asserting: (in-)equality, containment, regular expression\nmatching, and so on.\n\nTo make an assertion using a matcher, GoogleTest offers three macros:\n\n * [`assert_that!`] panics if the assertion fails, aborting the test.\n * [`expect_that!`] logs an assertion failure, marking the test as having\n   failed, but allows the test to continue running (called a _non-fatal\n   assertion_). It requires the use of the [`gtest`] attribute macro\n   on the test itself.\n * [`verify_that!`] has no side effects and evaluates to a [`Result\u003c()\u003e`] whose\n   `Err` variant describes the assertion failure, if there is one. In\n   combination with the\n   [`?` operator](https://doc.rust-lang.org/reference/expressions/operator-expr.html#the-question-mark-operator),\n   this can be used to abort the test on assertion failure without panicking. It\n   is also the building block for the other two macros above.\n\nFor example:\n\n```rust\nuse googletest::prelude::*;\n\n#[test]\nfn fails_and_panics() {\n    let value = 2;\n    assert_that!(value, eq(4));\n}\n\n#[gtest]\nfn two_logged_failures() {\n    let value = 2;\n    expect_that!(value, eq(4)); // Test now failed, but continues executing.\n    expect_that!(value, eq(5)); // Second failure is also logged.\n}\n\n#[test]\nfn fails_immediately_without_panic() -\u003e Result\u003c()\u003e {\n    let value = 2;\n    verify_that!(value, eq(4))?; // Test fails and aborts.\n    verify_that!(value, eq(2))?; // Never executes.\n    Ok(())\n}\n\n#[test]\nfn simple_assertion() -\u003e Result\u003c()\u003e {\n    let value = 2;\n    verify_that!(value, eq(4)) // One can also just return the last assertion.\n}\n```\n\nThis library includes a rich set of matchers, covering:\n\n * Equality, numeric inequality, and approximate equality;\n * Strings and regular expressions;\n * Containers and set-theoretic matching.\n\nMatchers are composable:\n\n```rust\nuse googletest::prelude::*;\n\n#[gtest]\nfn contains_at_least_one_item_at_least_3() {\n    let value = vec![1, 2, 3];\n    expect_that!(value, contains(ge(3)));\n}\n```\n\nThey can also be logically combined:\n\n```rust\nuse googletest::prelude::*;\n\n#[gtest]\nfn strictly_between_9_and_11() {\n    let value = 10;\n    expect_that!(value, gt(9).and(not(ge(11))));\n}\n```\n\n## Pattern-matching\n\nOne can use the macro [`matches_pattern!`] to create a composite matcher for a\nstruct or enum that matches fields with other matchers:\n\n```rust\nuse googletest::prelude::*;\n\nstruct AStruct {\n    a_field: i32,\n    another_field: i32,\n    a_third_field: \u0026'static str,\n}\n\n#[test]\nfn struct_has_expected_values() {\n    let value = AStruct {\n        a_field: 10,\n        another_field: 100,\n        a_third_field: \"A correct value\",\n    };\n    expect_that!(value, matches_pattern!(AStruct {\n        a_field: eq(10),\n        another_field: gt(50),\n        a_third_field: contains_substring(\"correct\"),\n    }));\n}\n```\n\n## Writing matchers\n\nOne can extend the library by writing additional matchers. To do so, create a\nstruct holding the matcher's data and have it implement the trait [`Matcher`]:\n\n```rust\nstruct MyEqMatcher\u003cT\u003e {\n    expected: T,\n}\n\nimpl\u003cT: PartialEq + Debug + Copy\u003e Matcher\u003cT\u003e for MyEqMatcher\u003cT\u003e {\n    fn matches(\u0026self, actual: T) -\u003e MatcherResult {\n         (self.expected == actual).into()\n    }\n\n    fn describe(\u0026self, matcher_result: MatcherResult) -\u003e String {\n        match matcher_result {\n            MatcherResult::Match =\u003e {\n                format!(\"is equal to {:?} the way I define it\", self.expected)\n            }\n            MatcherResult::NoMatch =\u003e {\n                format!(\"isn't equal to {:?} the way I define it\", self.expected)\n            }\n        }\n    }\n}\n```\n\nIt is recommended to expose a function which constructs the matcher:\n\n```rust\npub fn eq_my_way\u003cT: PartialEq + Debug\u003e(expected: T) -\u003e impl Matcher\u003cT\u003e {\n    MyEqMatcher { expected }\n}\n```\n\nThe new matcher can then be used in the assertion macros:\n\n```rust\n#[gtest]\nfn should_be_equal_by_my_definition() {\n    expect_that!(10, eq_my_way(10));\n}\n```\n\n## Non-fatal assertions\n\nUsing non-fatal assertions, a single test is able to log multiple assertion\nfailures. Any single assertion failure causes the test to be considered having\nfailed, but execution continues until the test completes or otherwise aborts.\n\nThis is analogous to the `EXPECT_*` family of macros in GoogleTest.\n\nTo make a non-fatal assertion, use the macro [`expect_that!`]. The test must\nalso be marked with [`gtest`] instead of the Rust-standard `#[test]`.\n\n```rust\nuse googletest::prelude::*;\n\n#[gtest]\nfn three_non_fatal_assertions() {\n    let value = 2;\n    expect_that!(value, eq(2));  // Passes; test still considered passing.\n    expect_that!(value, eq(3));  // Fails; logs failure and marks the test failed.\n    expect_that!(value, eq(4));  // A second failure, also logged.\n}\n```\n\nThis can be used in the same tests as `verify_that!`, in which case the test\nfunction must also return [`Result\u003c()\u003e`]:\n\n```rust\nuse googletest::prelude::*;\n\n#[gtest]\nfn failing_non_fatal_assertion() -\u003e Result\u003c()\u003e {\n    let value = 2;\n    expect_that!(value, eq(3));  // Just marks the test as having failed.\n    verify_that!(value, eq(2))?;  // Passes, so does not abort the test.\n    Ok(())        // Because of the failing expect_that! call above, the\n                  // test fails despite returning Ok(())\n}\n```\n\n```rust\nuse googletest::prelude::*;\n\n#[gtest]\nfn failing_fatal_assertion_after_non_fatal_assertion() -\u003e Result\u003c()\u003e {\n    let value = 2;\n    verify_that!(value, eq(3))?; // Fails and aborts the test.\n    expect_that!(value, eq(3));  // Never executes, since the test already aborted.\n    Ok(())\n}\n```\n\n### Interoperability\n\nYou can use the `#[gtest]` macro together with many other libraries\nsuch as [rstest](https://crates.io/crates/rstest). Just apply both attribute\nmacros to the test:\n\n```rust\n#[gtest]\n#[rstest]\n#[case(1)]\n#[case(2)]\n#[case(3)]\nfn rstest_works_with_google_test(#[case] value: u32) -\u003e Result\u003c()\u003e {\n   verify_that!(value, gt(0))\n}\n```\n\nMake sure to put `#[gtest]` *before* `#[rstest]`. Otherwise the\nannotated test will run twice, since both macros will attempt to register a test\nwith the Rust test harness.\n\nThe macro also works together with\n[async tests with Tokio](https://docs.rs/tokio/latest/tokio/attr.gtest.html) in\nthe same way:\n\n```rust\n#[gtest]\n#[tokio::test]\nasync fn should_work_with_tokio() -\u003e Result\u003c()\u003e {\n    verify_that!(3, gt(0))\n}\n```\n\nThere is one caveat when running async tests: test failure reporting through\n`and_log_failure` will not work properly if the assertion occurs on a different\nthread than runs the test.\n\n## Predicate assertions\n\nThe macro [`verify_pred!`] provides predicate assertions analogous to\nGoogleTest's `EXPECT_PRED` family of macros. Wrap an invocation of a predicate\nin a `verify_pred!` invocation to turn that into a test assertion which passes\nprecisely when the predicate returns `true`:\n\n```rust\nfn stuff_is_correct(x: i32, y: i32) -\u003e bool {\n    x == y\n}\n\nlet x = 3;\nlet y = 4;\nverify_pred!(stuff_is_correct(x, y))?;\n```\n\nThe assertion failure message shows the arguments and the values to which they\nevaluate:\n\n```\nstuff_is_correct(x, y) was false with\n  x = 3,\n  y = 4\n```\n\nThe `verify_pred!` invocation evaluates to a [`Result\u003c()\u003e`] just like\n[`verify_that!`]. There is also a macro [`expect_pred!`] to make a non-fatal\npredicaticate assertion.\n\n## Unconditionally generating a test failure\n\nThe macro [`fail!`] unconditionally evaluates to a `Result` indicating a test\nfailure. It can be used analogously to [`verify_that!`] and [`verify_pred!`] to\ncause a test to fail, with an optional formatted message:\n\n```rust\n#[test]\nfn always_fails() -\u003e Result\u003c()\u003e {\n    fail!(\"This test must fail with {}\", \"today\")\n}\n```\n\n## Configuration\n\nThis library is configurable through environment variables. Since the\nconfiguration does not impact whether a test fails or not but how a failure is\ndisplayed, we recommend setting those variables in the personal\n`~/.cargo/config.toml` instead of in the project-scoped `Cargo.toml`.\n\n### Configuration variable list\n\n| Variable name | Description                                             |\n| ------------- | ------------------------------------------------------- |\n| NO_COLOR      | Disables colored output. See \u003chttps://no-color.org/\u003e.   |\n| FORCE_COLOR   | Forces colors even when the output is piped to a file.  |\n\n## Contributing Changes\n\nPlease read [CONTRIBUTING.md](CONTRIBUTING.md) for details on how to contribute\nto this project.\n\n[`and_log_failure()`]: https://docs.rs/googletest/*/googletest/trait.GoogleTestSupport.html#tymethod.and_log_failure\n[`assert_that!`]: https://docs.rs/googletest/*/googletest/macro.assert_that.html\n[`expect_pred!`]: https://docs.rs/googletest/*/googletest/macro.expect_pred.html\n[`expect_that!`]: https://docs.rs/googletest/*/googletest/macro.expect_that.html\n[`fail!`]: https://docs.rs/googletest/*/googletest/macro.fail.html\n[`gtest`]: https://docs.rs/googletest/*/googletest/attr.gtest.html\n[`matches_pattern!`]: https://docs.rs/googletest/*/googletest/macro.matches_pattern.html\n[`verify_pred!`]: https://docs.rs/googletest/*/googletest/macro.verify_pred.html\n[`verify_that!`]: https://docs.rs/googletest/*/googletest/macro.verify_that.html\n[`Describe`]: https://docs.rs/googletest/*/googletest/matcher/trait.Describe.html\n[`Matcher`]: https://docs.rs/googletest/*/googletest/matcher/trait.Matcher.html\n[`Result\u003c()\u003e`]: https://docs.rs/googletest/*/googletest/type.Result.html\n","funding_links":[],"categories":["Rust","Development tools"],"sub_categories":["Testing"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgoogle%2Fgoogletest-rust","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgoogle%2Fgoogletest-rust","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgoogle%2Fgoogletest-rust/lists"}