{"id":17977613,"url":"https://github.com/martinmoene/catch-lest-other-comparison","last_synced_at":"2026-02-27T19:01:37.036Z","repository":{"id":48786254,"uuid":"97302619","full_name":"martinmoene/catch-lest-other-comparison","owner":"martinmoene","description":"Tabularised feature comparison between Catch, doctest and lest C++ test frameworks","archived":false,"fork":false,"pushed_at":"2021-07-12T08:39:42.000Z","size":50,"stargazers_count":30,"open_issues_count":3,"forks_count":3,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-04-04T00:24:57.956Z","etag":null,"topics":["catch","comparison","doctest","lest","tdd-framework"],"latest_commit_sha":null,"homepage":"","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/martinmoene.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2017-07-15T08:26:20.000Z","updated_at":"2025-01-17T14:18:27.000Z","dependencies_parsed_at":"2022-07-26T00:47:06.186Z","dependency_job_id":null,"html_url":"https://github.com/martinmoene/catch-lest-other-comparison","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/martinmoene/catch-lest-other-comparison","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/martinmoene%2Fcatch-lest-other-comparison","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/martinmoene%2Fcatch-lest-other-comparison/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/martinmoene%2Fcatch-lest-other-comparison/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/martinmoene%2Fcatch-lest-other-comparison/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/martinmoene","download_url":"https://codeload.github.com/martinmoene/catch-lest-other-comparison/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/martinmoene%2Fcatch-lest-other-comparison/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":266626115,"owners_count":23958344,"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-07-23T02:00:09.312Z","response_time":66,"last_error":null,"robots_txt_status":null,"robots_txt_updated_at":null,"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":["catch","comparison","doctest","lest","tdd-framework"],"created_at":"2024-10-29T17:28:40.441Z","updated_at":"2026-02-27T19:01:31.996Z","avatar_url":"https://github.com/martinmoene.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ca id=\"top\"\u003e\u003c/a\u003e\n# Catch\u0026ndash;doctest\u0026ndash;lest feature comparison\nTabularised feature comparison between Catch, doctest and lest C++ test frameworks.\n\n[Skip to the feature comparison](#table).\n\nNote: This is an initial draft, it is incomplete and likely contains errors.  \n\nIdeas, additions, corrections, signaling omissions, etc. welcome!\n\n---\n\n**The frameworks in this comparison share the following properties:**\n\n- The frameworks are available as single-file header-only library.\n- Test cases are described by a string, they are not identified by a function name.\n- There is a single assertion macro for expressions.   \nExpressions are decomposed and original expression code can be shown alongside the values they represent.\n- Fixtures can be created inside a test case. They are called sections or sub cases.\n\n**Advent of Catch**\u0026emsp;Expression-decomposing assertions and function-level fixtures (sections) were introduced by Kevlin Henney in his talk *Rethinking Unit Testing in C++* at ACCU London in May 2010 [[1]](#KH1). At that time, Phil Nash was working on a testing framework called *YACUTS* (Yet Another C++ Unit Test System) that would bring similar capabilities, be it a little more intrusively [[2]](#PN1). Kevlin's talk inspired Phil to develop ***Catch*** [[3]](#PN2).\n\n**Kevlin's emphasis on simplicity** in testing and the desire to understand how expression decomposition works inspired Martin Moene to write ***lest*** [[4]](#MM1). The code of *lest* is intentionally kept small, so that it should be fairly easy to gain insight in how things work.\n\n**Accompanying test code with the code to test** was one of the drivers for Viktor Kirilov to write ***doctest*** [[5]](#VK1). Others are to enable using *doctest* with many different compilers and to shine in compile-time and run-time performance. At CppCon 2017 Viktor gave a presentation that explains many techniques used in doctest and Catch [[23]](#VK2).\n\n\u003cp\u003e\u0026nbsp;\u003c/p\u003e\n\n\u003ca id=\"table\"\u003e\u003c/a\u003e\n\nFeature                           | [doctest](#DOT)| [Catch-1](#CA1)| [Catch-2](#CA2)| [lest](#LST)| Notes |\n----------------------------------|:------:|:------:|:------:|:------:|-------|\n**License**                       | MIT    |BSL-1.0 |BSL-1.0 |BSL-1.0 | \u0026nbsp;|\n  \u0026nbsp;                          | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp;|\n**C++ standard related**          | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp;|\nC++ standard                      | C++98  | C++98  | C++11  | C++11  | \u0026nbsp;|\nCan work without exceptions       |\u0026#10003;| -      | -      | -      | reduced functionality |\nRequires RTTI                     | -      | -      | -      | -      | \u0026nbsp;|\n  \u0026nbsp;                          | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp;|\n**Fields of use**                 | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp;|\nDesktop                           |\u0026#10003;|\u0026#10003;|\u0026#10003;|\u0026#10003;| \u0026nbsp;|\nEmbedded (tiny)                   | ?      | ?      | ?      | ?      | \u0026nbsp;|\nEmbedded (largish)                | ?      | ?      | ?      |\u0026#10003;| \u0026nbsp;|\nApplication, tool                 | ?      |\u0026#10003;|\u0026#10003;| ?      | \u0026nbsp;|\nLibrary, framework                | ?      |\u0026#10003;|\u0026#10003;|\u0026#10003;| \u0026nbsp;|\nOperating System                  | ?      | ?      | ?      |\u0026#10003;| lest: IncludeOS |\n  \u0026nbsp;                          | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp;|\n**Documentation of framework**    | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | see [[22]](#WGD) |\nFirst contact                     | ?      | ?      | ?      | ?      | new users |\nEducation                         | ?      | ?      | ?      | ?      | new \u0026 existing users |\nSupport                           | ?      | ?      | ?      | ?      | experienced users |\nTroubleshooting                   | ?      | ?      | ?      | ?      | annoyed users |\nInternals                         | ?      | ?      | ?      | ?      | fellow developers |\nReference                         | ?      | ?      | ?      | ?      | everyone|\nTry it online                     |\u0026#10003;|\u0026#10003;|\u0026#10003;|\u0026#10003;| on wandbox |\nForum                             | -      |\u0026#10003;|\u0026#10003;| -      | Catch: Google group |\nChat                              |\u0026#10003;| -      | -      | -      | doctest: Gitter \u0026nbsp;|\nStackOverflow tag              | -      |\u0026#10003;|\u0026#10003;| -      | see [[19]](#SOC) |\n  \u0026nbsp;                          | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp;|\n**Test organisation**             | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp;|\nSuites of tests                   |\u0026#10003;| -      | -      | -      | \u0026nbsp;|\nFixtures (sections)               |\u0026#10003;|\u0026#10003;|\u0026#10003;|\u0026#10003;| doctest: sub case |\nFixtures (class-based)            |\u0026#10003;|\u0026#10003;|\u0026#10003;| -      | \u0026nbsp;|\nType-parameterised tests          |\u0026#10003;|\u0026#10003;|\u0026#10003;| -      | \u0026nbsp;|\nValue-parameterised tests         | -      | -      | -      | -      | \u0026nbsp;|\nAuto-registration of tests        |\u0026#10003;|\u0026#10003;|\u0026#10003;|\u0026#10003;| \u0026nbsp;|\nTabularised tests                 | -      | -      | -      |\u0026#10003;| array of lambdas |\nAllow tests accompany code        |\u0026#10003;|\u0026#10003;|\u0026#10003;| -      | Catch: not recommended...          |\nAllow tests in header files       |\u0026#10003;|\u0026#10003;|\u0026#10003;| -      | ...to avoid long compilation times |\n  \u0026nbsp;                          | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp;|\n**Assertions**                    | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp;|\nBDD style scenarios               |\u0026#10003;|\u0026#10003;|\u0026#10003;|\u0026#10003;| \u0026nbsp;|\nAssert expressions                |\u0026#10003;|\u0026#10003;|\u0026#10003;|\u0026#10003;| \u0026nbsp;|\nAssert exceptions                 |\u0026#10003;|\u0026#10003;|\u0026#10003;|\u0026#10003;| \u0026nbsp;|\nAssert abortion (death)           | -      | -      | -      | -      | \u0026nbsp;|\nAssert assertions (death)         | -      | -      | -      | -      | \u0026nbsp;|\nExpression decomposition          |\u0026#10003;|\u0026#10003;|\u0026#10003;|\u0026#10003;| see [[2]](#PN1) |\nFloating point comparison, approx |\u0026#10003;|\u0026#10003;|\u0026#10003;|\u0026#10003;| \u0026nbsp;|\nFloating point comparison, ULP    | -      | -      |\u0026#10003;| -      | see stf [[10]](#ULP)|\nHamcrest matchers (built-in)      | -      | some   | some   | \u0026bull; | see [[12](#C1M)][[13](#C2M)][[14](#HLM)][[15](#HCT)] |\nHamcrest matchers (user-definable)| -      |\u0026#10003;|\u0026#10003;| -      | \u0026nbsp;|\nMacros with and without prefix    |\u0026#10003;|\u0026#10003;|\u0026#10003;|\u0026#10003;| CATCH_CHECK(), CHECK()|\n  \u0026nbsp;                          | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp;|\n**Other test facilities**         | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp;|\nMocking support                   | \u0026bull; | \u0026bull; | \u0026bull; | \u0026bull; | via 3rd party |\nLogging facility                  |\u0026#10003;|\u0026#10003;|\u0026#10003;| -      | \u0026nbsp;|\nLogging levels                    | -      | -      | -      | -      | \u0026nbsp;|\nCheckpoints                       | -      | -      | -      | -      | see Boost.Test [[11]](#BTC) |\nTest decorators                   |\u0026#10003;| -      | -      | -      | see [[16](#DTD)] |\nTest data generators              | -      | \u0026bull; | -      | -      | Cach-1: undocumented |\nProperty-based testing            | -      | -      | -      | -      | \u0026nbsp;|\nObtain name of current test       | ?      | \u0026bull; | ?      | -      | Catch-1: undocumented |\n  \u0026nbsp;                          | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp;|\n**API / seams**                   | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp;|\nReporting user-defined types      |\u0026#10003;|\u0026#10003;|\u0026#10003;|\u0026#10003;| \u0026nbsp;|\nReporter API                      | -      |\u0026#10003;|\u0026#10003;| -      | \u0026nbsp;|\nEvent listeners                   | -      |\u0026#10003;|\u0026#10003;| -      | \u0026nbsp;|\nRun-time context                  |\u0026#10003;|\u0026#10003;|\u0026#10003;| -      | \u0026nbsp;|\n  \u0026nbsp;                          | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp;|\n**Reporting formats**             | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp;|\nConsole, multi-line               |\u0026#10003;|\u0026#10003;|\u0026#10003;| -      | \u0026nbsp;|\nConsole, single-line (compact)    | -      |\u0026#10003;|\u0026#10003;|\u0026#10003;| similar to compiler error |\nJUnit                             | -      |\u0026#10003;|\u0026#10003;| -      | result at end|\nXML                               | -      |\u0026#10003;|\u0026#10003;| -      | streaming|\nTeamCity                          | -      |\u0026#10003;|\u0026#10003;| -      | \u0026nbsp;|\nTAP                               | -      |\u0026#10003;|\u0026#10003;| -      | \u0026nbsp;|\nAutomake                          | -      |\u0026#10003;|\u0026#10003;| -      | \u0026nbsp;|\n  \u0026nbsp;                          | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp;|\n**Reporting options**             | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp;|\nColourised output (run-time)      |\u0026#10003;|\u0026#10003;|\u0026#10003;| \u0026nbsp; | \u0026nbsp;|\nColourised output (compile-time)  |\u0026#10003;| -      | -      |\u0026#10003;| \u0026nbsp;|\nLiteral suffix u, l, f            | -      | -      | -      |\u0026#10003;| compile-time |\n  \u0026nbsp;                          | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp;|\n**Test execution**                | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp;|\nConcurrent execution of tests     | -      | -      | -      | -      | \u0026nbsp;|\nIsolated execution of tests       | -      | -      | -      | -      | \u0026nbsp;|\nLimit test execution time         |\u0026#10003;| -      | -      | -      | doctest: via test decorator |\nSignal tests without assertions   | -      |\u0026#10003;|\u0026#10003;| -      | \u0026nbsp;|\nSupports floating point exceptions| -      | -      | -      | -      | \u0026nbsp;|\nSupports Posix signals            |\u0026#10003;|\u0026#10003;|\u0026#10003;| -      | \u0026nbsp;|\nSupports Windows SEH              |\u0026#10003;|\u0026#10003;|\u0026#10003;| -      | \u0026nbsp;|\n  \u0026nbsp;                          | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp;|\n**Compile-time control**          | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp;|\nImprove compilation speed         |\u0026#10003;|\u0026#10003;|\u0026#10003;|-       | reduced functionality |\nOmit macros without prefix        |\u0026#10003;|\u0026#10003;|\u0026#10003;|\u0026#10003;| \u0026nbsp;|\nOmit std::wstring                 | -      | -      | -      |\u0026#10003;| \u0026nbsp;|\nOmit std::cout, cerr, clog        | -      |\u0026#10003;|\u0026#10003;| -      | \u0026nbsp;|\nSpecify terminal color system     |\u0026#10003;|\u0026#10003;|\u0026#10003;| -      | none, ansi, win32 |\nSpecify terminal width            | -      |\u0026#10003;|\u0026#10003;| -      | \u0026nbsp;|\nControl handling of POSIX signals |\u0026#10003;|\u0026#10003;|\u0026#10003;| -      | \u0026nbsp;|\nControl handling of SE on Windows |\u0026#10003;|\u0026#10003;|\u0026#10003;| -      | \u0026nbsp;|\nEnable leak checking on Windows   | -      |\u0026#10003;|\u0026#10003;| -      | uses CRT Debug Heap|\nEnable use of \\_\\_COUNTER\\_\\_     | -      |\u0026#10003;|\u0026#10003;| -      | for internal unique names|\n  \u0026nbsp;                          | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp;|\n**Run-time control, commandline** | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp;|\nHelp screen                       |\u0026#10003;|\u0026#10003;|\u0026#10003;|\u0026#10003;| \u0026nbsp;|\nList selected suites              |\u0026#10003;| -      | -      | -      | \u0026nbsp;|\nList selected tests               |\u0026#10003;|\u0026#10003;|\u0026#10003;|\u0026#10003;| \u0026nbsp;|\nList tags of selected tests       | -      |\u0026#10003;|\u0026#10003;|\u0026#10003;| \u0026nbsp;|\nSelect tests by suite             |\u0026#10003;| -      | -      | -      | \u0026nbsp;|\nSelect tests by name              |\u0026#10003;|\u0026#10003;|\u0026#10003;|\u0026#10003;| \u0026nbsp;|\nSelect tests by tag               |\u0026#10003;|\u0026#10003;|\u0026#10003;|\u0026#10003;| \u0026nbsp;|\nSelect tests by file              |\u0026#10003;|\u0026#10003;|\u0026#10003;| -      | Catch: via filename as tags |\nSelect section by name            |\u0026#10003;|\u0026#10003;|\u0026#10003;| -      | \u0026nbsp;|\nSelect supports regexp            |\u0026#10003;| -      | -      |\u0026#10003;| \u0026nbsp;|\nOmit assertions expected to throw | -      |\u0026#10003;|\u0026#10003;| -      | \u0026nbsp;|\nCount selected tests              |\u0026#10003;| -      | -      |\u0026#10003;| \u0026nbsp;|\nAbort at N-th failure             |\u0026#10003;|\u0026#10003;|\u0026#10003;|\u0026#10003;| lest: N is 1 |\nBreak into debugger               |\u0026#10003;|\u0026#10003;|\u0026#10003;| -      | \u0026nbsp;|\nReport passing tests              |\u0026#10003;|\u0026#10003;|\u0026#10003;|\u0026#10003;| \u0026nbsp;|\nTime duration of tests            |\u0026#10003;|\u0026#10003;|\u0026#10003;|\u0026#10003;| \u0026nbsp;|\nControl order of tests            |\u0026#10003;|\u0026#10003;|\u0026#10003;|\u0026#10003;| \u0026nbsp;|\nRepeat tests                      | -      |\u0026#10003;|\u0026#10003;|\u0026#10003;| \u0026nbsp;|\n  \u0026nbsp;                          | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp;|\n**IDE integration**               | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | see [[17]](#IDE) |\nOutput-window-compatible reports  |\u0026#10003;|\u0026#10003;|\u0026#10003;|\u0026#10003;| click through to source |\nC++ Builder                       | ?      | ?      | ?      | ?      | \u0026nbsp;|\nCLion                             | \u0026#10003;|\u0026#10003;|\u0026#10003;| -      | \u0026nbsp;|\nCode::Blocks                      | ?      | ?      | ?      | ?      | \u0026nbsp;|\nCodeLite                          | ?      | ?      | ?      | ?      | \u0026nbsp;|\nEclipse CDT                       | ?      | ?      | ?      | ?      | \u0026nbsp;|\nKDevelop                          | ?      | ?      | ?      | ?      | \u0026nbsp;|\nQt Creator                        | ?      | ?      | \u0026#10003;| ?      | \u0026nbsp;|\nVisual-MinGW                      | ?      | ?      | ?      | ?      | \u0026nbsp;|\nVisual Studio                     | \u0026bull; | \u0026bull; | \u0026bull; | -      | Catch and doctest: via ReSharper C++ |\nVisual Studio Code                | -      | -      | -      | -      | see [issue](https://github.com/Microsoft/vscode-cpptools/issues/1079)|\n  \u0026nbsp;                          | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp;|\n**Platforms**                     | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp;|\nAIX / XL                          | ?      | 11.1.0 | ?      | ?      | Catch-1: 2013 |\nmacOS / clang                     | ?      | ?      | ?      | ?      | \u0026nbsp;|\nmacOS / gcc                       | 4.4-6  | ?      | ?      | ?      | source: Travis |\nmacOS / XCode / clang             | 6.4-8.3| 7.3-8  | 7.3-8  | ?      | source: Travis |\nmacOS / XCode / gcc               | 6.4-7.3| 7.3-8  | 7.3-8  | ?      | source: Travis |\nLinux / clang                     | 3.4-4  | 3.4-3.8| 3.5-3.8| 3.6-3.7| source: Travis |\nLinux / gcc                       | 4.4-6  | 4.4-6  | 4.8-6  | 4.9-5  | source: Travis |\nSolaris / SunPro                  | ?      | 5.12.0 | ?      | ?      | Catch-1: 2013 |\nWindows / clang                   | ?      | ?      | ?      | 3.2+   | \u0026nbsp;|\nWindows / gcc                     | 7      | ?      | ?      | 4.8.1+ | \u0026nbsp;|\nWindows / Visual C++              | 9-15   | 10-15  | 14-15  | 12-15  | Catch-1: possibly from 8 |\nWindows / Cygwin / clang          | ?      | ?      | ?      | ?      | \u0026nbsp;|\nWindows / Cygwin / gcc            | ?      | ?      | ?      | ?      | \u0026nbsp;|\nWindows / msys2 / clang           | ?      | ?      | ?      | ?      | \u0026nbsp;|\nWindows / msys2 / gcc             | ?      | ?      | ?      | ?      | \u0026nbsp;|\n  \u0026nbsp;                          | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp;|\n**Quality of project**            | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | note: challenge *42* |\nCode of conduct                   | -      |\u0026#10003;|\u0026#10003;| -      | \u0026nbsp;|\nFollows CII best practices        |[\u0026#10003;](https://bestpractices.coreinfrastructure.org/projects/503)|[partly](https://bestpractices.coreinfrastructure.org/projects/1224)|[partly](https://bestpractices.coreinfrastructure.org/projects/1224)|[partly](https://bestpractices.coreinfrastructure.org/projects/1127)| see [[21]](#CII)|\n  \u0026nbsp;                          | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp;|\n**Quality of code**               | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp;|\nUnit testing                      |\u0026#10003;|\u0026#10003;|\u0026#10003;|\u0026#10003;| details below |\nCI testing                        |\u0026#10003;|\u0026#10003;|\u0026#10003;|\u0026#10003;| details below |\nCI code analysis                  |\u0026#10003;| -      | -      | -      | details below |\n  \u0026nbsp;                          | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp;|\n**Testing of framework**          | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp;|\nUnit tests                        |\u0026#10003;|\u0026#10003;|\u0026#10003;|\u0026#10003;| \u0026nbsp;|\nTests itself                      |\u0026#10003;|\u0026#10003;|\u0026#10003;|\u0026#10003;| \u0026nbsp;|\nBaseline tests                    |\u0026#10003;|\u0026#10003;|\u0026#10003;| -      | \u0026nbsp;|\n  \u0026nbsp;                          | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp;|\n**CI testing**                    | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp;|\nTravis                            |\u0026#10003;|\u0026#10003;|\u0026#10003;|\u0026#10003;| \u0026nbsp;|\nAppveyor                          |\u0026#10003;|\u0026#10003;|\u0026#10003;|\u0026#10003;| \u0026nbsp;|\nCoverage scan                     |\u0026#10003;| -      |\u0026#10003;| -      | \u0026nbsp;|\nCoverity scan                     |\u0026#10003;| -      | -      | -      | \u0026nbsp;|\n  \u0026nbsp;                          | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp;|\n**CI static code analysis**       | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp;|\nclang-tidy                        |\u0026#10003;| -      | -      | -      | \u0026nbsp;|\nCppCheck                          |\u0026#10003;| -      | -      | -      | \u0026nbsp;|\nCppCoreCheck                      | -      | -      | -      | -      | \u0026nbsp;|\nPVS-Studio                        | -      | -      | -      | -      | \u0026nbsp;|\nOCLint                            |\u0026#10003;| -      | -      | -      | \u0026nbsp;|\nReSharper C++                     | -      | -      | -      | -      | \u0026nbsp;|\nVisual Studio                     |\u0026#10003;| -      | -      | -      | \u0026nbsp;|\n  \u0026nbsp;                          | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp;|\n**Code-related**                  | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp;|\nCompile-time performance, relative|\u0026#9734;\u0026#9734;\u0026#9734;|\u0026#9734;\u0026#9734;| ? | ? | see [[20]](#DTB) |\nRun-time performance, relative    |\u0026#9734;\u0026#9734;\u0026#9734;|\u0026#9734;\u0026#9734;| ? | ? | see [[20]](#DTB) |\nCompiler-warning friendly         |\u0026#9734;\u0026#9734;\u0026#9734;|\u0026#9734;\u0026#9734;|\u0026#9734;\u0026#9734;|\u0026#9734;\u0026#9734;| \u0026nbsp; |\nCompiles with -Werror -Wall -Wextra|\u0026#10003;|\u0026#10003;|\u0026#10003;|\u0026#10003;| \u0026nbsp;|\nCan provide canned main()         |\u0026#10003;|\u0026#10003;|\u0026#10003;| -      | \u0026nbsp;|\nOnly depends on C++ std library   |\u0026#10003;|\u0026#10003;|\u0026#10003;|\u0026#10003;| \u0026nbsp;|\nSingle-file header-only           |\u0026#10003;|\u0026#10003;|\u0026#10003;|\u0026#10003;| \u0026nbsp;|\nSize, LOC                         | 4,500  | 9,100  | 8,800  | 1,000  | see [[18]](#LOC) |\n  \u0026nbsp;                          | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp;|\n**Distribution of framework**     | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp;|\nGitHub single-file download       |\u0026#10003;|\u0026#10003;|\u0026#10003;|\u0026#10003;| from the landing page |\nconan                             |\u0026#10003;|\u0026#10003;|\u0026#10003;| -      | \u0026nbsp;|\nhunter                            |\u0026#10003;| ?      | -      | -      | \u0026nbsp;|\nvcpkg                             |\u0026#10003;|\u0026#10003;|\u0026#10003;| -      | \u0026nbsp;|\nLinux and other (search)          | [search](https://repology.org/metapackage/doctest/information) | \u0026rarr; | [search](https://repology.org/metapackage/catch/information) | [search](https://repology.org/metapackage/lest/information) | on [Repology](https://repology.org/) |\n  \u0026nbsp;                          | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp; | \u0026nbsp;|\n**Feature**                       | [doctest](#DOT)| [Catch-1](#CA1)| [Catch-2](#CA2)| [lest](#LST)| Notes |\n\n\nReferences\n----------\n\n\u003ca id=\"KH1\"\u003e\u003c/a\u003e[1] Kevlin Henney. [Rethinking Unit Testing in C++](http://accu.org/index.php/accu_branches/accu_london/accu_london_may_2010) ([Video](http://skillsmatter.com/podcast/agile-testing/kevlin-henney-rethinking-unit-testing-in-c-plus-plus)). Skills Matter, May 2010.  \n\u003ca id=\"PN1\"\u003e\u003c/a\u003e[2] Phil Nash. [The Ultimate C++ Unit Test Framework](http://www.levelofindirection.com/journal/2010/5/21/the-ultimate-c-unit-test-framework.html). Blog, May 2010.  \n\u003ca id=\"PN2\"\u003e\u003c/a\u003e[3] Phil Nash. [Unit Testing in C++ and Objective-C just got easier](http://www.levelofindirection.com/journal/2010/12/28/unit-testing-in-c-and-objective-c-just-got-easier.html). Blog announcement, December 2010.  \n\u003ca id=\"MM1\"\u003e\u003c/a\u003e[4] Martin Moene. [lest errors escape testing](http://martin-moene.blogspot.nl/2013/06/lest-tiny-c11-unittest-helper.html). Blog announcement, June 2013.  \n\u003ca id=\"VK1\"\u003e\u003c/a\u003e[5] Viktor Kirilov. [doctest – the Lightest C++ Unit Testing Framework](https://accu.org/index.php/journals/2343). Announcement in Overload 137, February 2017.  \n\u003ca id=\"CA1\"\u003e\u003c/a\u003e[6] Phil Nash. [Catch-1 on GitHub](https://github.com/catchorg/Catch2/tree/Catch1.x). 2010.  \n\u003ca id=\"CA2\"\u003e\u003c/a\u003e[7] Phil Nash. [Catch-2 on GitHub](https://github.com/catchorg/Catch2). 2017.  \n\u003ca id=\"DOT\"\u003e\u003c/a\u003e[8] Viktor Kirilov. [doctest on GitHub](https://github.com/onqtam/doctest/). 2014.  \n\u003ca id=\"LST\"\u003e\u003c/a\u003e[9] Martin Moene. [lest on GitHub](https://github.com/martinmoene/lest/). 2013.  \n\u003ca id=\"ULP\"\u003e\u003c/a\u003e[10] Joel Falcou. [Design rationale for using ULP with stf](https://github.com/jfalcou/stf/blob/master/doc/rationale.md).  \n\u003ca id=\"BTC\"\u003e\u003c/a\u003e[11] Gennadiy Rozental and Raffi Enficiaud. [Checkpoints in Boost.Test](http://www.boost.org/doc/libs/1_64_0/libs/test/doc/html/boost_test/test_output/test_tools_support_for_logging/checkpoints.html).  \n\u003ca id=\"C1M\"\u003e\u003c/a\u003e[12] [Matchers in Catch-1](https://github.com/catchorg/Catch2/blob/Catch1.x/docs/matchers.md#built-in-matchers).  \n\u003ca id=\"C2M\"\u003e\u003c/a\u003e[13] [Matchers in Catch-2](https://github.com/catchorg/Catch2/blob/master/docs/matchers.md#built-in-matchers).  \n\u003ca id=\"HLM\"\u003e\u003c/a\u003e[14] [Matchers in lest: via hamlest](https://github.com/martinmoene/hamlest).  \n\u003ca id=\"HCT\"\u003e\u003c/a\u003e[15] [Hamcrest 1.3 Quick Reference (PDF)](http://www.marcphilipp.de/downloads/posts/2013-01-02-hamcrest-quick-reference/Hamcrest-1.3.pdf).  \n\u003ca id=\"DTD\"\u003e\u003c/a\u003e[16] [Decorators in doctest](https://github.com/onqtam/doctest/blob/master/doc/markdown/testcases.md#decorators).  \n\u003ca id=\"IDE\"\u003e\u003c/a\u003e[17] Wikipedia. [List of C++ IDEs](https://en.wikipedia.org/wiki/Comparison_of_integrated_development_environments#C.2FC.2B.2B).  \n\u003ca id=\"LOC\"\u003e\u003c/a\u003e[18] [CodeBlocks IDE](http://www.codeblocks.org/). Non-empty, non-comment lines, via File \u003e Properties.  \n\u003ca id=\"SOC\"\u003e\u003c/a\u003e[19] StackOverflow. [Questions tagged catch-unit-test](https://stackoverflow.com/questions/tagged/catch-unit-test).  \n\u003ca id=\"DTB\"\u003e\u003c/a\u003e[20] Viktor Kirilov. [doctest Benchmarks](https://github.com/onqtam/doctest/blob/master/doc/markdown/benchmarks.md#benchmarks). May 2017.  \n\u003ca id=\"CII\"\u003e\u003c/a\u003e[21] Linux Foundation (LF). [CII Best Practices](https://bestpractices.coreinfrastructure.org/).  \n\u003ca id=\"WGD\"\u003e\u003c/a\u003e[22] Jacob Kaplan-Moss. [Writing great documentation](https://www.slideshare.net/jacobian/writing-great-documentation-codeconf-2011).  \n\u003ca id=\"VK2\"\u003e\u003c/a\u003e[23] Viktor Kirilov. [Mix Tests and Production Code With Doctest - Implementing and Using the Fastest Modern C++ Testing Framework](https://www.youtube.com/watch?time_continue=1\u0026v=eH1CxEC29l8) ([slides](http://slides.com/onqtam/2017_cppcon_doctest)). [CppCon 2017](https://cppcon.org/).  \n\n\u003cp style=\"height:60em;\"\u003e\u003c/p\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmartinmoene%2Fcatch-lest-other-comparison","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmartinmoene%2Fcatch-lest-other-comparison","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmartinmoene%2Fcatch-lest-other-comparison/lists"}