{ "info": { "author": "willemt", "author_email": "himself@willemthiart.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.2", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Topic :: System :: Logging" ], "description": ".. code-block::\n :class: ignore\n\n \ud83c\udf4btest /\u02c8l\u025bm\u0259n t\u025bst/ Noun.\n 1. A test which appears to test a feature, but in fact does not test that feature at all. \n [us. I reviewed that pull request and found one \ud83c\udf4btest that doesn't test right.]\n\nWhat?\n=====\n\nA unittest runner for detecting \ud83c\udf4btests.\n\nWhy?\n====\n\nGood development practice dictates that new features should be accompanied with new tests. Good tests can identify regressions and accidental removal of features.\n\nA \ud83c\udf4btest, is a test which appears to test a feature, but in fact does not test that feature at all. \ud83c\udf4btests can be considered worse than not having a test at all, because they give the false assumption that your new feature is tested. If a regression occurs, \ud83c\udf4btests won't let you know. The detection of \ud83c\udf4btests can identify situations when the feature does not meet your requirements. Detecting \ud83c\udf4btests helps ensure code quality and feature delivery.\n\nThis library identifies \ud83c\udf4btests. This is done by examining two git branches: the feature, and the merge destination. The algorithm separates business logic from testing code, and then uses Git to revert business logic to it's previous state (the same as the merge destination). A test suite is then run on the reverted business logic with the new tests. Any tests that are successful are marked as \ud83c\udf4btests.\n\nTesting for \ud83c\udf4btests is a form of mutation testing. The mutation operation in this case is reverting the business logic to it's previous state before the feature was written.\n\nQuickstart\n==========\n\n.. code-block:: bash\n :class: ignore\n\n pip install lemontest\n manage.py test --testrunner=lemontest.djangorunner.DjangoLemonTestRunner --to-branch=master --from-branch=feature/123\n\nIt must be a git repository.\n----------------------------\nLemontest needs a git repository to be able to revert business logic.\n\nTravis CI\n---------\n\nTravis conveniently provides environment variables we can use.\n\n.. code-block:: bash\n :class: ignore\n\n pip install lemontest\n manage.py test --testrunner=lemontest.djangorunner.DjangoLemonTestRunner --to-branch=$TRAVIS_BRANCH --from-branch=$TRAVIS_PULL_REQUEST_SHA\n\nAlgorithm\n=========\n\n1. Get source files that have changed (git diff)\n\n2. Identify test source files (use unittest discovery and intersect with step 1)\n\n3. Identify business logic files (set difference between step 1 and step2)\n\n4. Use git to revert business logic code (git checkout)\n\n5. Run tests that have changed\n\n6. Raise an exception for each test that succeeds\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/willemt/lemontest", "keywords": "development testing", "license": "BSD", "maintainer": "", "maintainer_email": "", "name": "lemontest", "package_url": "https://pypi.org/project/lemontest/", "platform": "", "project_url": "https://pypi.org/project/lemontest/", "project_urls": { "Homepage": "https://github.com/willemt/lemontest" }, "release_url": "https://pypi.org/project/lemontest/0.4.6/", "requires_dist": null, "requires_python": "", "summary": "A unittest runner for detecting lemon tests", "version": "0.4.6" }, "last_serial": 5149804, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "0eaf7f1da26acdeb057c2e653c9a83b5", "sha256": "8f4dced4701f46d8331ead12276718ad51e8e7f2e48837e199024a06fc0de29b" }, "downloads": -1, "filename": "lemontest-0.1.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "0eaf7f1da26acdeb057c2e653c9a83b5", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 6742, "upload_time": "2019-01-27T08:06:18", "url": "https://files.pythonhosted.org/packages/26/4e/137fe7917cea335025151b925e9783a13b65a74c00f10296ea6ff5049351/lemontest-0.1.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6f69bc1e6279a140596da124c06b612a", "sha256": "c58b0bfdd4dbc994a91b21a524b81dab29d0390b653f76a649e955993ad99f49" }, "downloads": -1, "filename": "lemontest-0.1.0.tar.gz", "has_sig": false, "md5_digest": "6f69bc1e6279a140596da124c06b612a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5975, "upload_time": "2019-01-27T08:06:14", "url": "https://files.pythonhosted.org/packages/b2/58/6d07d196829daae4e95fd02c3572aeedd3b1db717507cc37781a9dfa40df/lemontest-0.1.0.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "366f58c14a1b4e4d289af1133ab762f0", "sha256": "63a9d687b5ee1e5c3151d642ee388fcb45638538d8af4b2c4723de678cec6ea6" }, "downloads": -1, "filename": "lemontest-0.2.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "366f58c14a1b4e4d289af1133ab762f0", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 6849, "upload_time": "2019-02-27T09:51:35", "url": "https://files.pythonhosted.org/packages/f8/c8/b4dfab4566cb6f209c1be06be08f6b7349e87bfb9e53b06ce5dfa4d50d6e/lemontest-0.2.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "31356cec631811852747939e635178b5", "sha256": "2ffab0c1d62e9b612c8b84895f5dd6bf9a79d2b651e4474c356e7e328681dd31" }, "downloads": -1, "filename": "lemontest-0.2.0.tar.gz", "has_sig": false, "md5_digest": "31356cec631811852747939e635178b5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6083, "upload_time": "2019-02-27T09:51:32", "url": "https://files.pythonhosted.org/packages/08/46/9db1e7da9aa0f28b33d21a53a93c8f8f78945bf7344e03113d0457f98b3e/lemontest-0.2.0.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "c39e8d1a82b357deba713469e821f9ea", "sha256": "2b07a4c962f4aefe0d167ec8280da32cdd35e1c7bd0cda7f6f09e0426f5ef7af" }, "downloads": -1, "filename": "lemontest-0.3.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "c39e8d1a82b357deba713469e821f9ea", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 7102, "upload_time": "2019-03-07T00:25:39", "url": "https://files.pythonhosted.org/packages/79/f7/14a883de2febd01f3077d78299493910a83271ac0037d1fea49715c4ca8a/lemontest-0.3.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "bf83192a8683568999be9d71ed044750", "sha256": "6fcb482885f9d3711d13f16282e592d09b6bc000110a83635e0a99aae99b3a25" }, "downloads": -1, "filename": "lemontest-0.3.0.tar.gz", "has_sig": false, "md5_digest": "bf83192a8683568999be9d71ed044750", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6346, "upload_time": "2019-03-07T00:25:36", "url": "https://files.pythonhosted.org/packages/2d/31/843c207a09b3668deff0a6cf723d6ee46a7de5a9f0e91ae32fae44718106/lemontest-0.3.0.tar.gz" } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "03d5431b227fdca5da67df8ae6c4e8ab", "sha256": "742f283875bd84096d63e593d9eeca8018199a3d613dd3d1c98c7498997642fb" }, "downloads": -1, "filename": "lemontest-0.3.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "03d5431b227fdca5da67df8ae6c4e8ab", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 7130, "upload_time": "2019-03-07T01:38:22", "url": "https://files.pythonhosted.org/packages/fd/41/0e1bf7873a3c9390c95b8a46859a76030ae794353fd0ece788f95d5ff55c/lemontest-0.3.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f44814ac05e9d396ce1ced62e464b598", "sha256": "2832ddcc20f964b236987c0695f08774372faeba8e1c980e105c84497dbcc3e5" }, "downloads": -1, "filename": "lemontest-0.3.1.tar.gz", "has_sig": false, "md5_digest": "f44814ac05e9d396ce1ced62e464b598", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6375, "upload_time": "2019-03-07T01:38:19", "url": "https://files.pythonhosted.org/packages/09/7f/4af96155132cdfda7d13fff3cbe6fee080cceb246adab4236f8e189abe18/lemontest-0.3.1.tar.gz" } ], "0.3.2": [ { "comment_text": "", "digests": { "md5": "8435bbe25662e9a9b4a0aeabf433f135", "sha256": "306cee3ae1bfc84ae9865eaa3c8c7f3bb061be47079a473fd2f1d786bf3af83e" }, "downloads": -1, "filename": "lemontest-0.3.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "8435bbe25662e9a9b4a0aeabf433f135", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 7132, "upload_time": "2019-03-08T23:13:56", "url": "https://files.pythonhosted.org/packages/3d/b2/4d9dab120b9cea7dedffca257be978cbae601c87a791519a4bbbc8462e07/lemontest-0.3.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "156bab1d38c18197ef5f002c3f88880a", "sha256": "c7154c2e4974fd5acc14334b9100e7e65fd208ece27c76302089d9f388849757" }, "downloads": -1, "filename": "lemontest-0.3.2.tar.gz", "has_sig": false, "md5_digest": "156bab1d38c18197ef5f002c3f88880a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6275, "upload_time": "2019-03-08T23:13:53", "url": "https://files.pythonhosted.org/packages/06/c4/9b4154fc31835f94bd9ed18261ea7daf9a0d756ce5f9c5aa53dd84bb3a62/lemontest-0.3.2.tar.gz" } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "0625090edcfe01b60bafc3fee6e65e96", "sha256": "f4d7f160273d9d306ebb98ff11ca7a440f382c57725942b313313c20a1cd27b1" }, "downloads": -1, "filename": "lemontest-0.4.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "0625090edcfe01b60bafc3fee6e65e96", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 7221, "upload_time": "2019-03-09T00:11:09", "url": "https://files.pythonhosted.org/packages/51/b7/74c62b0e490bf50cabc0fc66f77adc1ff05e6e6605552df378f5f86a3aef/lemontest-0.4.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5e0edb5959c462fcc8e10406f0796faf", "sha256": "07063688da35dc3c60cff3f3bc2cb5d8f01cb5cbaea8756f55818a22d228d69d" }, "downloads": -1, "filename": "lemontest-0.4.0.tar.gz", "has_sig": false, "md5_digest": "5e0edb5959c462fcc8e10406f0796faf", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6374, "upload_time": "2019-03-09T00:11:07", "url": "https://files.pythonhosted.org/packages/d4/e4/4ee71266692323a269dbb3d1d9e0e662c97ec38944960220fbd1b8b8f9b0/lemontest-0.4.0.tar.gz" } ], "0.4.1": [ { "comment_text": "", "digests": { "md5": "1f2b94370bf1a32977cd85430a5a881b", "sha256": "ddb535dd6670f50353861200a6dc35d7955ee00ffbfddf6330855c5b39d6bcaa" }, "downloads": -1, "filename": "lemontest-0.4.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "1f2b94370bf1a32977cd85430a5a881b", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 7326, "upload_time": "2019-03-09T10:12:16", "url": "https://files.pythonhosted.org/packages/63/d1/cf3f635caa169e1aa5da62543056552c38ea9c385b8a9fb8a53865c13811/lemontest-0.4.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "269dd49804264d620e9a24fc92cd20eb", "sha256": "b50790f054bc19d80348c4f9710abaad9ae645242f6c10b68fd7fcc8f641ee64" }, "downloads": -1, "filename": "lemontest-0.4.1.tar.gz", "has_sig": false, "md5_digest": "269dd49804264d620e9a24fc92cd20eb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6483, "upload_time": "2019-03-09T10:12:13", "url": "https://files.pythonhosted.org/packages/69/e7/2b180ab354df8e6835635ee95de1ebb3648cd032ba2b97b43324f378243d/lemontest-0.4.1.tar.gz" } ], "0.4.2": [ { "comment_text": "", "digests": { "md5": "dcf2f6172b1bc0cf2efe96a8a2552338", "sha256": "00ddaafeff92648bf4aee1dfa16bb1c98262028d5c36ac820320359c89b57fe1" }, "downloads": -1, "filename": "lemontest-0.4.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "dcf2f6172b1bc0cf2efe96a8a2552338", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 7635, "upload_time": "2019-03-29T05:25:25", "url": "https://files.pythonhosted.org/packages/54/9b/1aa06ac6693abfd01a2e2d74ed4315c412ff2223f0c4314841cbfb5d1a5d/lemontest-0.4.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b535b5fe4e3998fc0dc5646bfc837ddb", "sha256": "57585e536d054a338966595e78caef8a1c3e0586100ef13452ef2b5558322156" }, "downloads": -1, "filename": "lemontest-0.4.2.tar.gz", "has_sig": false, "md5_digest": "b535b5fe4e3998fc0dc5646bfc837ddb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6791, "upload_time": "2019-03-29T05:25:22", "url": "https://files.pythonhosted.org/packages/0c/e7/4bf5468c0a6471638e808db45b665da9adef607eda5f90153145721f48c3/lemontest-0.4.2.tar.gz" } ], "0.4.3": [ { "comment_text": "", "digests": { "md5": "d89abc0d12f16278bdc928107973a81f", "sha256": "5687c9e1b91f30741d26ca2c2f713141b38677d2834713b1ccef8a6d5b31b329" }, "downloads": -1, "filename": "lemontest-0.4.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "d89abc0d12f16278bdc928107973a81f", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 7749, "upload_time": "2019-03-29T09:23:54", "url": "https://files.pythonhosted.org/packages/0c/ed/eedf0fb8d7c7c57a395d1b9613b2db38ad67d4e2fb6898ae55aac4efb795/lemontest-0.4.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1474dda1e6dd4c3f8911dfe5f5e4a37d", "sha256": "5446479cf2210c63056c09ffa5e4abe12f45c2cdf57a15a8fed274024b909f60" }, "downloads": -1, "filename": "lemontest-0.4.3.tar.gz", "has_sig": false, "md5_digest": "1474dda1e6dd4c3f8911dfe5f5e4a37d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6881, "upload_time": "2019-03-29T09:23:52", "url": "https://files.pythonhosted.org/packages/a7/20/a692ebcd4f6e70a2f69dc7fee6e446ea02c3a6137e4b8987174977b85c1b/lemontest-0.4.3.tar.gz" } ], "0.4.4": [ { "comment_text": "", "digests": { "md5": "7f008e89f88a958a6e021d7c486ff25a", "sha256": "f161679b47a7ace06eab0979e85539ca67477fa95e44caf10372b36be923e89d" }, "downloads": -1, "filename": "lemontest-0.4.4-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "7f008e89f88a958a6e021d7c486ff25a", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 7956, "upload_time": "2019-04-01T00:59:17", "url": "https://files.pythonhosted.org/packages/d3/4d/ea9c8297efd185b93dec2f3bd649bb92791091e51afdf6a05cee0e8ff8c6/lemontest-0.4.4-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "615f0f1f4b79df05da41fd1c7db2c591", "sha256": "01a41ba4384d1cd3d89fe986d795989da6276a72b6012f6d59a88f9dcf41c6fc" }, "downloads": -1, "filename": "lemontest-0.4.4.tar.gz", "has_sig": false, "md5_digest": "615f0f1f4b79df05da41fd1c7db2c591", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7043, "upload_time": "2019-04-01T00:59:15", "url": "https://files.pythonhosted.org/packages/16/37/abd02a49169788cc97bf8eece2f2ca7863c551f1942fd63f61adae6de3c8/lemontest-0.4.4.tar.gz" } ], "0.4.5": [ { "comment_text": "", "digests": { "md5": "211f1da6870bdf4171cc1b3bfd05637b", "sha256": "f9ff21a764e129abfe50def209f1ac9adb16cbf1086eea31424c9b4812bfc628" }, "downloads": -1, "filename": "lemontest-0.4.5-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "211f1da6870bdf4171cc1b3bfd05637b", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 8142, "upload_time": "2019-04-01T10:32:09", "url": "https://files.pythonhosted.org/packages/02/40/0daea9123cda2558936e3c991bde28d7033ac24e9c4f0800235392c7fb8c/lemontest-0.4.5-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "18f8586418174f247b8d3d72847530fc", "sha256": "852fd3f64a440e1fd61145b0e8a6ee61f904fe6aa233fb63dc3bf3c9684001db" }, "downloads": -1, "filename": "lemontest-0.4.5.tar.gz", "has_sig": false, "md5_digest": "18f8586418174f247b8d3d72847530fc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7247, "upload_time": "2019-04-01T10:32:07", "url": "https://files.pythonhosted.org/packages/b7/c5/cfe855103a5e3f490d34015fb0d717e96d77c52d53c359bb1ac157e7c9e7/lemontest-0.4.5.tar.gz" } ], "0.4.6": [ { "comment_text": "", "digests": { "md5": "e5fda6d66be971dd4bf4400aa51e3463", "sha256": "3c45028f37f9b3d7b46b58e52e182d71652eecf3986d2b3d09c018df3124235b" }, "downloads": -1, "filename": "lemontest-0.4.6-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "e5fda6d66be971dd4bf4400aa51e3463", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 8183, "upload_time": "2019-04-16T12:26:18", "url": "https://files.pythonhosted.org/packages/21/f1/e124fe5b62be0e2317fc766cc178ae06eebf4a6d952590977ee04bd30872/lemontest-0.4.6-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "aa362fd4f64ed3f8398cc73e57f20118", "sha256": "09cc9c88b9d0c573b9d02203683d140ff87bfa6504be2b4a00674428f3bffa91" }, "downloads": -1, "filename": "lemontest-0.4.6.tar.gz", "has_sig": false, "md5_digest": "aa362fd4f64ed3f8398cc73e57f20118", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7353, "upload_time": "2019-04-16T12:26:15", "url": "https://files.pythonhosted.org/packages/44/e2/5209996b5948bc109d093e04693d17ab73e6071d24d4c33bd7daca54c356/lemontest-0.4.6.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "e5fda6d66be971dd4bf4400aa51e3463", "sha256": "3c45028f37f9b3d7b46b58e52e182d71652eecf3986d2b3d09c018df3124235b" }, "downloads": -1, "filename": "lemontest-0.4.6-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "e5fda6d66be971dd4bf4400aa51e3463", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 8183, "upload_time": "2019-04-16T12:26:18", "url": "https://files.pythonhosted.org/packages/21/f1/e124fe5b62be0e2317fc766cc178ae06eebf4a6d952590977ee04bd30872/lemontest-0.4.6-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "aa362fd4f64ed3f8398cc73e57f20118", "sha256": "09cc9c88b9d0c573b9d02203683d140ff87bfa6504be2b4a00674428f3bffa91" }, "downloads": -1, "filename": "lemontest-0.4.6.tar.gz", "has_sig": false, "md5_digest": "aa362fd4f64ed3f8398cc73e57f20118", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7353, "upload_time": "2019-04-16T12:26:15", "url": "https://files.pythonhosted.org/packages/44/e2/5209996b5948bc109d093e04693d17ab73e6071d24d4c33bd7daca54c356/lemontest-0.4.6.tar.gz" } ] }