{"id":13434928,"url":"https://github.com/proper-testing/proper","last_synced_at":"2026-03-27T02:43:41.533Z","repository":{"id":37752143,"uuid":"697866","full_name":"proper-testing/proper","owner":"proper-testing","description":"PropEr: a QuickCheck-inspired property-based testing tool for Erlang","archived":false,"fork":false,"pushed_at":"2026-03-12T15:00:04.000Z","size":3927,"stargazers_count":910,"open_issues_count":50,"forks_count":165,"subscribers_count":34,"default_branch":"master","last_synced_at":"2026-03-19T11:20:30.899Z","etag":null,"topics":["codecov-badge","erlang","erlang-versions-badge","release-badge"],"latest_commit_sha":null,"homepage":"http://proper-testing.github.io","language":"Erlang","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/proper-testing.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"COPYING","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":"2010-06-01T19:41:33.000Z","updated_at":"2026-03-12T15:00:15.000Z","dependencies_parsed_at":"2023-02-16T19:45:21.370Z","dependency_job_id":"1b319702-f846-4e34-8422-42dc08e56826","html_url":"https://github.com/proper-testing/proper","commit_stats":null,"previous_names":["manopapad/proper"],"tags_count":7,"template":false,"template_full_name":null,"purl":"pkg:github/proper-testing/proper","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/proper-testing%2Fproper","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/proper-testing%2Fproper/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/proper-testing%2Fproper/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/proper-testing%2Fproper/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/proper-testing","download_url":"https://codeload.github.com/proper-testing/proper/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/proper-testing%2Fproper/sbom","scorecard":{"id":747043,"data":{"date":"2025-08-18","repo":{"name":"github.com/proper-testing/proper","commit":"db4ac35639e0ce8504ff3f07517dae49412a8674"},"scorecard":{"version":"v5.2.1-41-g40576783","commit":"40576783fda6698350fcbbeaea760ff827433034"},"score":4.2,"checks":[{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"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/40576783fda6698350fcbbeaea760ff827433034/docs/checks.md#packaging"}},{"name":"Code-Review","score":1,"reason":"Found 3/30 approved changesets -- score normalized to 1","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/40576783fda6698350fcbbeaea760ff827433034/docs/checks.md#code-review"}},{"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/40576783fda6698350fcbbeaea760ff827433034/docs/checks.md#dangerous-workflow"}},{"name":"Maintained","score":0,"reason":"1 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/40576783fda6698350fcbbeaea760ff827433034/docs/checks.md#maintained"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/ci.yml:1","Warn: no topLevel permission defined: .github/workflows/codespell.yml:1","Warn: no topLevel permission defined: .github/workflows/shellcheck.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/40576783fda6698350fcbbeaea760ff827433034/docs/checks.md#token-permissions"}},{"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/40576783fda6698350fcbbeaea760ff827433034/docs/checks.md#binary-artifacts"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:62: update your workflow using https://app.stepsecurity.io/secureworkflow/proper-testing/proper/ci.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:72: update your workflow using https://app.stepsecurity.io/secureworkflow/proper-testing/proper/ci.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:80: update your workflow using https://app.stepsecurity.io/secureworkflow/proper-testing/proper/ci.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:37: update your workflow using https://app.stepsecurity.io/secureworkflow/proper-testing/proper/ci.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:39: update your workflow using https://app.stepsecurity.io/secureworkflow/proper-testing/proper/ci.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:52: update your workflow using https://app.stepsecurity.io/secureworkflow/proper-testing/proper/ci.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codespell.yml:7: update your workflow using https://app.stepsecurity.io/secureworkflow/proper-testing/proper/codespell.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/codespell.yml:8: update your workflow using https://app.stepsecurity.io/secureworkflow/proper-testing/proper/codespell.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/shellcheck.yml:7: update your workflow using https://app.stepsecurity.io/secureworkflow/proper-testing/proper/shellcheck.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/shellcheck.yml:8: update your workflow using https://app.stepsecurity.io/secureworkflow/proper-testing/proper/shellcheck.yml/master?enable=pin","Info:   0 out of   7 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   3 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/40576783fda6698350fcbbeaea760ff827433034/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/40576783fda6698350fcbbeaea760ff827433034/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/40576783fda6698350fcbbeaea760ff827433034/docs/checks.md#vulnerabilities"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/40576783fda6698350fcbbeaea760ff827433034/docs/checks.md#security-policy"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: COPYING:0","Info: FSF or OSI recognized license: GNU General Public License v3.0: COPYING:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/40576783fda6698350fcbbeaea760ff827433034/docs/checks.md#license"}},{"name":"Fuzzing","score":10,"reason":"project is fuzzed","details":["Info: ErlangPropertyBasedTesting integration found: examples/b64.erl:30","Info: ErlangPropertyBasedTesting integration found: examples/car_fsm.erl:30","Info: ErlangPropertyBasedTesting integration found: examples/car_statem.erl:30","Info: ErlangPropertyBasedTesting integration found: examples/elevator_fsm.erl:39","Info: ErlangPropertyBasedTesting integration found: examples/ets_statem.erl:35","Info: ErlangPropertyBasedTesting integration found: examples/labyrinth.erl:31","Info: ErlangPropertyBasedTesting integration found: examples/magic.erl:29","Info: ErlangPropertyBasedTesting integration found: examples/mastermind.erl:35","Info: ErlangPropertyBasedTesting integration found: examples/pdict_statem.erl:34","Info: ErlangPropertyBasedTesting integration found: examples/stack_adt.erl:37","Info: ErlangPropertyBasedTesting integration found: test/auto_export_test1.erl:32","Info: ErlangPropertyBasedTesting integration found: test/auto_export_test2.erl:35","Info: ErlangPropertyBasedTesting integration found: test/command_props.erl:29","Info: ErlangPropertyBasedTesting integration found: test/erlang_abstract_code_test.erl:41","Info: ErlangPropertyBasedTesting integration found: test/error_statem.erl:31","Info: ErlangPropertyBasedTesting integration found: test/ets_counter.erl:34","Info: ErlangPropertyBasedTesting integration found: test/ets_statem_test.erl:37","Info: ErlangPropertyBasedTesting integration found: test/exists_tests.erl:28","Info: ErlangPropertyBasedTesting integration found: test/fun_tests.erl:32","Info: ErlangPropertyBasedTesting integration found: test/improper_lists_statem.erl:16","Info: ErlangPropertyBasedTesting integration found: test/let_tests.erl:34","Info: ErlangPropertyBasedTesting integration found: test/more_commands_test.erl:35","Info: ErlangPropertyBasedTesting integration found: test/no_native_parse_test.erl:34","Info: ErlangPropertyBasedTesting integration found: test/nogen_statem.erl:33","Info: ErlangPropertyBasedTesting integration found: test/numbers_fsm.erl:36","Info: ErlangPropertyBasedTesting integration found: test/pdict_fsm.erl:36","Info: ErlangPropertyBasedTesting integration found: test/perf_max_size.erl:31","Info: ErlangPropertyBasedTesting integration found: test/post_false.erl:33","Info: ErlangPropertyBasedTesting integration found: test/prec_false.erl:31","Info: ErlangPropertyBasedTesting integration found: test/proper_print.erl:32","Info: ErlangPropertyBasedTesting integration found: test/proper_specs_tests.erl:32","Info: ErlangPropertyBasedTesting integration found: test/proper_tests.erl:32","Info: ErlangPropertyBasedTesting integration found: test/rec_props_test1.erl:32","Info: ErlangPropertyBasedTesting integration found: test/rec_props_test2.erl:32","Info: ErlangPropertyBasedTesting integration found: test/shrinking_gotchas.erl:29","Info: ErlangPropertyBasedTesting integration found: test/symb_statem.erl:37","Info: ErlangPropertyBasedTesting integration found: test/symb_statem_maps.erl:30","Info: ErlangPropertyBasedTesting integration found: test/targeted_fsm.erl:36","Info: ErlangPropertyBasedTesting integration found: test/targeted_shrinking_test.erl:32","Info: ErlangPropertyBasedTesting integration found: test/targeted_statem.erl:36","Info: ErlangPropertyBasedTesting integration found: test/weird_types.erl:36","Info: ErlangPropertyBasedTesting integration found: examples/b64.erl:30","Info: ErlangPropertyBasedTesting integration found: examples/car_fsm.erl:30","Info: ErlangPropertyBasedTesting integration found: examples/car_statem.erl:30","Info: ErlangPropertyBasedTesting integration found: examples/elevator_fsm.erl:39","Info: ErlangPropertyBasedTesting integration found: examples/ets_statem.erl:35","Info: ErlangPropertyBasedTesting integration found: examples/labyrinth.erl:31","Info: ErlangPropertyBasedTesting integration found: examples/magic.erl:29","Info: ErlangPropertyBasedTesting integration found: examples/mastermind.erl:35","Info: ErlangPropertyBasedTesting integration found: examples/pdict_statem.erl:34","Info: ErlangPropertyBasedTesting integration found: examples/stack_adt.erl:37","Info: ErlangPropertyBasedTesting integration found: test/auto_export_test1.erl:32","Info: ErlangPropertyBasedTesting integration found: test/auto_export_test2.erl:35","Info: ErlangPropertyBasedTesting integration found: test/command_props.erl:29","Info: ErlangPropertyBasedTesting integration found: test/erlang_abstract_code_test.erl:41","Info: ErlangPropertyBasedTesting integration found: test/error_statem.erl:31","Info: ErlangPropertyBasedTesting integration found: test/ets_counter.erl:34","Info: ErlangPropertyBasedTesting integration found: test/ets_statem_test.erl:37","Info: ErlangPropertyBasedTesting integration found: test/exists_tests.erl:28","Info: ErlangPropertyBasedTesting integration found: test/fun_tests.erl:32","Info: ErlangPropertyBasedTesting integration found: test/improper_lists_statem.erl:16","Info: ErlangPropertyBasedTesting integration found: test/let_tests.erl:34","Info: ErlangPropertyBasedTesting integration found: test/more_commands_test.erl:35","Info: ErlangPropertyBasedTesting integration found: test/no_native_parse_test.erl:34","Info: ErlangPropertyBasedTesting integration found: test/nogen_statem.erl:33","Info: ErlangPropertyBasedTesting integration found: test/numbers_fsm.erl:36","Info: ErlangPropertyBasedTesting integration found: test/pdict_fsm.erl:36","Info: ErlangPropertyBasedTesting integration found: test/perf_max_size.erl:31","Info: ErlangPropertyBasedTesting integration found: test/post_false.erl:33","Info: ErlangPropertyBasedTesting integration found: test/prec_false.erl:31","Info: ErlangPropertyBasedTesting integration found: test/proper_print.erl:32","Info: ErlangPropertyBasedTesting integration found: test/proper_specs_tests.erl:32","Info: ErlangPropertyBasedTesting integration found: test/proper_tests.erl:32","Info: ErlangPropertyBasedTesting integration found: test/rec_props_test1.erl:32","Info: ErlangPropertyBasedTesting integration found: test/rec_props_test2.erl:32","Info: ErlangPropertyBasedTesting integration found: test/shrinking_gotchas.erl:29","Info: ErlangPropertyBasedTesting integration found: test/symb_statem.erl:37","Info: ErlangPropertyBasedTesting integration found: test/symb_statem_maps.erl:30","Info: ErlangPropertyBasedTesting integration found: test/targeted_fsm.erl:36","Info: ErlangPropertyBasedTesting integration found: test/targeted_shrinking_test.erl:32","Info: ErlangPropertyBasedTesting integration found: test/targeted_statem.erl:36","Info: ErlangPropertyBasedTesting integration found: test/weird_types.erl:36"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/40576783fda6698350fcbbeaea760ff827433034/docs/checks.md#fuzzing"}},{"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/40576783fda6698350fcbbeaea760ff827433034/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/40576783fda6698350fcbbeaea760ff827433034/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 17 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/40576783fda6698350fcbbeaea760ff827433034/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-22T19:08:28.940Z","repository_id":37752143,"created_at":"2025-08-22T19:08:28.941Z","updated_at":"2025-08-22T19:08:28.941Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30798590,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-20T22:51:33.771Z","status":"online","status_checked_at":"2026-03-21T02:00:07.962Z","response_time":114,"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":["codecov-badge","erlang","erlang-versions-badge","release-badge"],"created_at":"2024-07-31T03:00:27.736Z","updated_at":"2026-03-27T02:43:41.521Z","avatar_url":"https://github.com/proper-testing.png","language":"Erlang","funding_links":[],"categories":["测试","Libraries"],"sub_categories":["Testing"],"readme":"[![Github Actions][github badge]][github]\n[![CodeCov][codecov badge]][codecov]\n[![Erlang Versions][erlang versions badge]][erlang]\n[![License][license badge]][license]\n[![Latest Release][release badge]][release]\n[![Hex PM][hex pm badge]][hex]\n[![Last Commit][commit badge]][commit]\n\nContact information and license\n-------------------------------\n\nPropEr (PROPerty-based testing tool for ERlang) is a QuickCheck-inspired\nopen-source property-based testing tool for Erlang, developed by Manolis\nPapadakis, Eirini Arvaniti, and Kostis Sagonas. The base PropEr system was\nwritten mainly by Manolis Papadakis, and the stateful code testing subsystem\nby Eirini Arvaniti. Kostis Sagonas has been actively maintaining its code\nbase since 2012.\n\nYou can reach PropEr's developers in the following ways:\n\n*   on the web: at [the project's home page](https://proper-testing.github.io)\n    or [the project's github page](https://github.com/proper-testing/proper)\n*   by email: take the tool's name (all lowercase), add a @ followed by\n    softlab dot ntua dot gr\n\nWe welcome user contributions and feedback (comments, suggestions, feature\nrequests, bug reports, patches, etc.).\n\nCopyright 2010-2026 by Manolis Papadakis, Eirini Arvaniti, and Kostis Sagonas.\n\nThis program is distributed under the [GPL](http://www.gnu.org/licenses/gpl.html),\nversion 3 or later. Please see the [COPYING][license] file for details.\n\n\nIntroduction\n------------\n\nTraditional testing methodologies essentially involve software testers writing a\nseries of test inputs for their programs, along with their corresponding\nexpected outputs, then running the program with these inputs and observing\nwhether it behaves as expected. This method of testing, while simple and easy to\nautomate, suffers from a few problems, such as:\n\n*   Writing test cases by hand is tedious and time consuming.\n*   It is hard to know whether the test suite covers all aspects of the software\n    under test.\n\nProperty-based testing is a novel approach to software testing, where the tester\nneeds only specify the generic structure of valid inputs for the program under\ntest, plus certain properties (regarding the program's behaviour and the\ninput-output relation) which are expected to hold for every valid input.\nA property-based testing tool, when supplied with this information, should randomly\nproduce progressively more complex valid inputs, then apply those inputs to the\nprogram while monitoring its execution, to ensure that it behaves according to\nits specification, as outlined in the supplied properties.\n\nHere are a few examples of simple properties a user may wish to test, expressed\nin natural language:\n\n*   The program should accept any character string and convert all lowercase\n    letters inside the string to uppercase.\n*   The program should accept any list of integers. If the input list is at\n    least 4 elements long, the program should return the 4th largest integer in\n    the list, else it should throw an exception.\n\nPropEr is such a property-based testing tool, designed to test programs written\nin the Erlang programming language. Its focus is on testing the behaviour of\npure functions. On top of that, it is equipped with two library modules that can\nbe used for testing stateful code. The input domain of functions is specified\nthrough the use of a type system, modeled closely after the type system of the\nlanguage itself. Properties are written using Erlang expressions, with the help\nof a few predefined macros.\n\nPropEr is also tightly integrated with Erlang's type language:\n\n*   Types expressed in the Erlang type language can be used instead of\n    generators written in PropEr's own type system as input data specifications.\n*   Generators for ADTs can be constructed automatically using the ADTs' API\n    functions.\n*   PropEr can test functions automatically, based solely on information\n    provided in their specs.\n\n\nQuickstart guide\n----------------\n\n*   Obtain a copy of PropEr's sources. You can either get a tagged version of\n    the tool (look under `Tags` on github) or you can clone the current code\n    base:\n\n    ```shell\n    git clone git@github.com:proper-testing/proper.git\n    ```\n*   Compile PropEr: Simply run `make` if you just want to build PropEr.\n    If you want to do some changes to PropEr or submit some pull request you\n    most likely will want to issue a `make test` to run its unit tests and\n    a `make dialyzer` call to also run dialyzer on PropEr's code base.\n    To do the above but also build PropEr's documentation issue a `make all`\n    call; in that case, you are going to need the `syntax_tools` application\n    and a recent version of `EDoc`).\n*   If you are using [Homebrew](https://brew.sh), you can simply:\n\n    ```shell\n    brew install proper\n    ```\n    and continue following the instructions below.\n*   Add PropEr's base directory to your Erlang library path, using one of the\n    following methods:\n    1.   `ERL_LIBS` environment variable: Add the following line to your shell\n         startup file (`~/.bashrc` in the case of the Bash shell):\n\n         ```shell\n         export ERL_LIBS=/full/path/to/proper\n         ```\n    2.   Erlang resource file: Add the following line to your `~/.erlang` file:\n\n         ```erlang\n         code:load_abs(\"/full/path/to/proper\").\n         ```\n*   Add the following include line to all source files that contain properties:\n\n    ```erlang\n    -include_lib(\"proper/include/proper.hrl\").\n    ```\n\n*   Compile those source files, preferably with `debug_info` enabled.\n*   For each property, run:\n\n    ```erlang\n    proper:quickcheck(your_module:some_property()).\n    ```\n    See also the section common problems below if you want to run\n    PropEr from EUnit.\n\n\nWhere to go from here\n---------------------\n\nTo get started on using PropEr, see the tutorials and testing tips provided on\n[PropEr's home page](http://proper-testing.github.io). On the same site you can\nfind a copy of PropEr's API documentation (you can also build this from source\nif you prefer, by running `make doc`), as well as links to more resources on\nproperty-based testing.\n\n\nCommon problems\n---------------\n\n### Using PropEr in conjunction with EUnit\n\nThe main issue is that both systems define a **`?LET`** macro. To avoid a\npotential clash, simply include PropEr's header file before EUnit's. That\nway, any instance of **`?LET`** will count as a PropEr **`?LET`**.\n\nAnother issue is that [EUnit captures standard output][eunit stdout],\nso normally PropEr output is not visible when `proper:quickcheck()` is\ninvoked from EUnit. You can work around this by passing the option\n`{to_file, user}` to `proper:quickcheck/2`. For example:\n```erlang\n?assertEqual(true, proper:quickcheck(your_mod:some_prop(), [{to_file, user}])).\n```\nThis will make PropEr properties visible also when invoked from EUnit.\n\n\nIncompatibilities with QuviQ's QuickCheck\n-----------------------------------------\n\nPropEr's notation and output format has been kept quite similar to that of\nQuviQ's QuickCheck in order to ease the reuse of existing testing code written\nfor that tool. However, incompatibilities are to be expected, since we never\nrun or owned a copy of QuviQ's QuickCheck and the two programs probably bear\nlittle resemblance under the hood. Here we provide a nonexhaustive list of\nknown incompatibilities:\n\n*   **`?SUCHTHATMAYBE`** behaves differently in PropEr.\n*   `proper_gen:pick/1` differs from `eqc_gen:pick/1` in return value format.\n*   PropEr handles `size` differently from QuickCheck.\n*   `proper:module/2` accepts options in the second argument instead of the\n    first; this is for consistency with other `module/2` functions in Erlang/OTP.\n\nAll the above are from circa 2010. Most likely, there exist many more\nincompatibilities between the two tools by now.\n\n\n\u003c!-- Links (alphabetically) --\u003e\n[codecov]: https://codecov.io/gh/proper-testing/proper\n[commit]: https://github.com/proper-testing/proper/commit/HEAD\n[erlang]: http://www.erlang.org\n[eunit stdout]: http://erlang.org/doc/apps/eunit/chapter.html#Running_EUnit\n[hex]: https://hex.pm/packages/proper\n[license]: ./COPYING\n[release]: https://github.com/proper-testing/proper/releases/latest\n[github]: https://github.com/proper-testing/proper/actions\n\n\u003c!-- Badges (alphabetically) --\u003e\n[codecov badge]: https://codecov.io/gh/proper-testing/proper/branch/master/graph/badge.svg\n[commit badge]: https://img.shields.io/github/last-commit/proper-testing/proper.svg?style=flat-square\n[erlang versions badge]: https://img.shields.io/badge/erlang-21.3%20to%2028.4-blue.svg?style=flat-square\n[hex pm badge]: https://img.shields.io/hexpm/v/proper.svg?style=flat\n[license badge]: https://img.shields.io/github/license/proper-testing/proper.svg?style=flat-square\n[release badge]: https://img.shields.io/github/release/proper-testing/proper.svg?style=flat-square\n[github badge]: https://github.com/proper-testing/proper/workflows/CI/badge.svg\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fproper-testing%2Fproper","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fproper-testing%2Fproper","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fproper-testing%2Fproper/lists"}