{"id":20495478,"url":"https://github.com/vyahello/unittest-bootcamp","last_synced_at":"2025-09-25T06:30:51.936Z","repository":{"id":43439790,"uuid":"139250120","full_name":"vyahello/unittest-bootcamp","owner":"vyahello","description":"📚 Basics of unittest python testing framework (python + unittest)","archived":false,"fork":false,"pushed_at":"2020-05-09T22:21:18.000Z","size":12,"stargazers_count":5,"open_issues_count":0,"forks_count":2,"subscribers_count":0,"default_branch":"master","last_synced_at":"2024-11-15T17:45:58.757Z","etag":null,"topics":["python-unittest","unittest"],"latest_commit_sha":null,"homepage":"https://vyahello.github.io/unittest-bootcamp","language":"Python","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/vyahello.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-06-30T13:05:42.000Z","updated_at":"2024-03-31T13:52:18.000Z","dependencies_parsed_at":"2022-09-10T17:21:43.116Z","dependency_job_id":null,"html_url":"https://github.com/vyahello/unittest-bootcamp","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vyahello%2Funittest-bootcamp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vyahello%2Funittest-bootcamp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vyahello%2Funittest-bootcamp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vyahello%2Funittest-bootcamp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/vyahello","download_url":"https://codeload.github.com/vyahello/unittest-bootcamp/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":234157963,"owners_count":18788501,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["python-unittest","unittest"],"created_at":"2024-11-15T17:46:01.470Z","updated_at":"2025-09-25T06:30:46.630Z","avatar_url":"https://github.com/vyahello.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Unittest bootcamp\nUnittest bootcamp project is aimed on helping to comprehend a `unittest` framework by newcomers.\nDescribes basics of unittest python testing framework.\n\n## Table of contents\nAll home works from every chapter will be located in it's `test_home.py` file.\n- [Chapter one (write test cases)](#chapter-one-(write-test-cases))\n  - [Syntax convention](#syntax-convention)\n  - [Basic test case example](#basic-test-case-example)\n  - [Run test case(s)](#run-test-case(s))\n  - [Assertions](#assertions)\n  - [Test case outcomes](#test-case-outcomes)\n  - [Run every test case outcome](#run-every-test-case-outcome)\n  - [Test case preconditions and postconditions](#test-case-preconditions-and-postconditions)\n  - [Additional materials](#additional-materials-for-chapter-one)\n- [Chapter two (write test suits)](#chapter-two-(write-test-suits))\n  - [Basic test suite example](#basic-test-suite-example)\n  - [Run test suite](#run-test-case(s))\n  - [Prepare test cases for next grouping into test suite](#prepare-test-cases-for-next-grouping-into-test-suite)\n  - [Group test cases into one test suite](#group-test-cases-into-one-test-suite)\n  - [Group separate tests into one test suite](#group-separate-tests-into-one-test-suite)\n  - [Group multiple test suite into one top level test suite](#group-multiple-test-suite-into-one-top-level-test-suite)\n  - [Run every grouped test suite](#run-every-grouped-test-suite)\n  - [Additional materials](#additional-materials-for-chapter-two)\n- [Contributing](#contributing)\n\n## Chapter one (write test cases)\nThis chapter consists basics of unittest test cases usage.\n### Syntax convention\n```python\n# every test module has to start with `test` prefix like `test_item.py`\n  \nfrom unittest import TestCase  # import TestCase class object\n \n  \nclass TestScenario(TestCase):  # every test scenario has to start with `Test` prefix\n \n    def test_method(self):  # every test method has to start with `test_` prefix\n        do_some_assertion()\n```\n### Basic test case example\n```python\n# test_list.py\n\nfrom typing import List\nfrom unittest import TestCase\n\n\nclass TestListMethods(TestCase):\n    \"\"\" This test case is verifying basic list data type methods. \"\"\"\n\n    def test_append(self) -\u003e None:\n        \"\"\" Test checks if given elements are adding to array \"\"\"\n\n        flist: List[...] = []\n        for i in range(1, 4):\n            flist.append(i)\n        self.assertEqual(flist, [1, 2, 3])\n\n    def test_extend(self) -\u003e None:\n        \"\"\" Test checks if given elements extends an array \"\"\"\n\n        flist: List[int] = [1, 2, 3]\n        flist.extend(range(4, 6))\n        self.assertEqual(flist[-2:], [4, 5])\n\n    def test_insert(self) -\u003e None:\n        \"\"\" Test checks if given element is inserted into array \"\"\"\n\n        flist: List[int] = [1, 2, 3]\n        flist.insert(3, 4)\n        self.assertEqual(flist, [1, 2, 3, 4])\n\n    def test_pop(self) -\u003e None:\n        \"\"\" Test checks if given element is deleted from an array \"\"\"\n\n        flist: List[int] = [1, 2, 3]\n        flist.pop(1)\n        self.assertEqual(flist, [1, 3])\n```\n### Run test case(s)\n```bash\n# Run TestListMethods test case in test_list.py test module\n~/unittest-bootcamp/chapter_one python -m unittest test_list.TestListMethods -v\n  \n# Run test_append test method from TestListMethods test case in test_list.py test module\n~/unittest-bootcamp/chapter_one python -m unittest test_list.TestListMethods.test_append -v\n  \n# Run all test cases in test_basic_data_types test module\n~/unittest-bootcamp/chapter_one python -m unittest test_list -v\n  \n# More unittest options\n~/unittest-bootcamp/chapter_one python -m unittest -h\n\n```\n### Assertions\n```python\n# test_asserts.py\n\nfrom unittest import TestCase\n\n\nclass TestAssertion(TestCase):\n    \"\"\" This test case asserts for truth \"\"\"\n\n    def test_truth(self) -\u003e None:\n        \"\"\" Test asserts if object is True or False \"\"\"\n\n        self.assertTrue(1)\n        self.assertFalse(0)\n\n    def test_is(self) -\u003e None:\n        \"\"\" Test asserts if one object is as an other object \"\"\"\n\n        self.assertIs('', str())\n        self.assertIsNot(4.01, int())\n\n    def test_equals(self) -\u003e None:\n        \"\"\" Test asserts the equality of two objects \"\"\"\n\n        self.assertEqual(8.88 / 4, 2.22)\n        self.assertNotEqual(8.88 / 4, 2.21)\n        self.assertLess(8.88 / 4, 2.23)\n        self.assertLessEqual(8.88 / 4, 2.22)\n        self.assertGreater(8.88 / 4, 2.21)\n        self.assertGreaterEqual(8.88 / 4, 2.22)\n\n    def test_contains(self) -\u003e None:\n        \"\"\" Test asserts for element membership in given container \"\"\"\n\n        self.assertIn(1, range(1, 5))\n        self.assertNotIn(5, range(1, 5))\n\n    def test_raised_error(self) -\u003e None:\n        \"\"\" Test asserts for correct raised exception \"\"\"\n\n        with self.assertRaises(ZeroDivisionError):\n            print(1 / 0)\n\n    def test_nones(self) -\u003e None:\n        \"\"\" Test asserts for None objects  \"\"\"\n\n        self.assertIsNone(None)\n        self.assertIsNotNone(list())\n\n    def test_regexp(self) -\u003e None:\n        \"\"\" Test asserts for correct regular expression functionality \"\"\"\n\n        self.assertRegex('400', '\\d+')\n        self.assertNotRegex('400', '\\s+')\n\n    def test_instances(self) -\u003e None:\n        \"\"\" Test asserts for class instances  \"\"\"\n\n        class ObjectOne:\n            \"\"\" Some class object. Overall do nothing  \"\"\"\n            pass\n\n        class ObjectTwo:\n            \"\"\" Some other class object. Overall do nothing  \"\"\"\n            pass\n\n        obj_one: ObjectOne = ObjectOne()\n        obj_two: ObjectTwo = ObjectTwo()\n\n        self.assertIsInstance(obj_one, ObjectOne)\n        self.assertNotIsInstance(obj_two, ObjectOne)\n\n    def test_containers(self) -\u003e None:\n        \"\"\" Test asserts for  correct containers functionality  \"\"\"\n\n        self.assertSequenceEqual(range(3), (0, 1, 2))\n        self.assertListEqual(list(range(3)), [0, 1, 2])\n        self.assertTupleEqual(tuple(range(3)), (0, 1, 2))\n        self.assertSetEqual(set(range(3)), {0, 1, 2})\n        self.assertDictEqual({2: 'two', 1: 'one'}, {1: 'one', 2: 'two'})\n\n```\n### Test case outcomes\n```python\n# test_outcomes.py\n\nfrom typing import List\nfrom unittest import TestCase, expectedFailure, skip\n\n\nclass TestOkBasic(TestCase):\n    \"\"\" Basic OK test case outcome \"\"\"\n\n    def test_odd_numbers_with_basic_algorithm(self) -\u003e None:\n        \"\"\" Test checks if odd numbers are filtered with basic algorithm \"\"\"\n\n        odds: List[...] = list()\n        for n in range(1, 6):\n            if n % 2 != 0:\n                odds.append(n)\n        self.assertListEqual(odds, [1, 3, 5])\n\n    def test_odd_numbers_with_list_comprehension(self) -\u003e None:\n        \"\"\" Test checks if odd numbers are filtered with list comprehension \"\"\"\n\n        self.assertListEqual([n for n in range(1, 6) if n % 2 != 0], [1, 3, 5])\n\n\nclass TestOkSkip(TestCase):\n    \"\"\" OK test case outcome with skipped tests \"\"\"\n\n    @skip('Skip test without any condition')\n    def test_odd_numbers_with_basic_algorithm(self) -\u003e None:\n        \"\"\" Test checks if odd numbers are filtered with basic algorithm \"\"\"\n\n        odds: List[...] = list()\n        for n in range(1, 6):\n            if n % 2 != 0:\n                odds.append(n)\n        self.assertListEqual(odds, [1, 3, 5])\n\n    def test_odd_numbers_with_list_comprehension(self) -\u003e None:\n        \"\"\" Test checks if odd numbers are filtered with list comprehension \"\"\"\n\n        self.skipTest('I want to skip this test')\n        self.assertListEqual([n for n in range(1, 6) if n % 2 != 0], [1, 3, 5])\n\n\nclass TestOkExpectedFailures(TestCase):\n    \"\"\" OK test case outcome with expected failures \"\"\"\n\n    @expectedFailure\n    def test_with_basic_algorithm(self) -\u003e None:\n        \"\"\" Test checks if odd numbers are filtered with basic algorithm \"\"\"\n\n        odds: List[...] = list()\n        for n in range(1, 6):\n            if n % 2 != 0:\n                odds.append(n)\n        self.assertListEqual(odds, None)\n\n    @expectedFailure\n    def test_with_list_comprehension(self) -\u003e None:\n        \"\"\" Test checks if odd numbers are filtered with list comprehension \"\"\"\n\n        self.assertListEqual([n for n in range(1, 6) if n % 2 != 0], None)\n\n\nclass TestFailBasic(TestCase):\n    \"\"\" Basic FAIL test case outcome \"\"\"\n\n    def test_with_basic_algorithm(self) -\u003e None:\n        \"\"\" Test checks if odd numbers are filtered with basic algorithm \"\"\"\n\n        odds: List[...] = list()\n        for n in range(1, 6):\n            if n % 2 != 0:\n                odds.append(n)\n        self.assertListEqual(odds, None)\n\n    def test_with_list_comprehension(self) -\u003e None:\n        \"\"\" Test checks if odd numbers are filtered with list comprehension \"\"\"\n\n        self.assertListEqual([n for n in range(1, 6) if n % 2 != 0], None)\n\n\nclass TestFailError(TestCase):\n    \"\"\" FAIL test case outcome with error tests \"\"\"\n\n    def test_with_basic_algorithm(self) -\u003e None:\n        \"\"\" Test checks if odd numbers are filtered with basic algorithm \"\"\"\n\n        odds: List[...] = list()\n        for n in range(1, 6):\n            if n % 2 != 0:\n                odds.append(n)\n        self.assertListEqual(odds)\n\n    def test_with_list_comprehension(self) -\u003e None:\n        \"\"\" Test checks if odd numbers are filtered with list comprehension \"\"\"\n\n        self.assertListEqual([n for n in range(1, 6) if n % 2 != 0])\n\n\nclass TestFailUnexpectedSuccess(TestCase):\n    \"\"\" FAIL test case outcome with unexpected success tests \"\"\"\n\n    @expectedFailure\n    def test_with_basic_algorithm(self) -\u003e None:\n        \"\"\" Test checks if odd numbers are filtered with basic algorithm \"\"\"\n\n        odds: List[...] = list()\n        for n in range(1, 6):\n            if n % 2 != 0:\n                odds.append(n)\n        self.assertListEqual(odds, [1, 3, 5])\n\n    @expectedFailure\n    def test_with_list_comprehension(self) -\u003e None:\n        \"\"\" Test checks if odd numbers are filtered with list comprehension \"\"\"\n\n        self.assertListEqual([n for n in range(1, 6) if n % 2 != 0], [1, 3, 5])\n\n```\n### Run every test case outcome\n```bash\n# Run basic OK test case\n~/unittest-bootcamp/chapter_one python -m unittest test_outcomes.TestOkBasic -v\n  \n# Run OK test case with skipped tests\n~/unittest-bootcamp/chapter_one python -m unittest test_outcomes.TestOkSkip -v\n  \n# Run OK test case with expected failures tests\n~/unittest-bootcamp/chapter_one python -m unittest test_outcomes.TestOkExpectedFailures -v\n  \n# Run basic FAIL test case with\n~/unittest-bootcamp/chapter_one python -m unittest test_outcomes.TestFailBasic -v\n  \n# Run FAIL test case with error tests\n~/unittest-bootcamp/chapter_one python -m unittest test_outcomes.TestFailError -v\n  \n# Run FAIL test case with unexpected success tests\n~/unittest-bootcamp/chapter_one python -m unittest test_outcomes.TestFailUnexpectedSuccess -v\n```\n### Test case preconditions and postconditions\n```python\nfrom unittest import TestCase\n\n\ndef setUpModule():\n    \"\"\" Setup for a test module \"\"\"\n\n    print('setUpModule is calling before all test cases in a test module.')\n\n    global module_string\n    module_string = 'module string'\n\n\ndef tearDownModule():\n    \"\"\" Teardown for a test module \"\"\"\n\n    print('tearDownModule is calling after all test cases in a test module.')\n\n\nclass TestStringMethods(TestCase):\n    \"\"\" This test case is verifying basic string data type methods for truth. \"\"\"\n\n    @classmethod\n    def setUpClass(cls) -\u003e None:\n        \"\"\" Setup for current test case. \"\"\"\n\n        print('setUpClass is calling once before all test methods.')\n        cls.class_string: str = 'class string'\n\n    @classmethod\n    def tearDownClass(cls) -\u003e None:\n        \"\"\" Teardown for current test case. \"\"\"\n\n        print('tearDownClass is calling once after all test methods.')\n        del cls.class_string\n\n    def setUp(self):\n        \"\"\" Setup for every test method. \"\"\"\n\n        print('setUp is calling before every test method.')\n        self.method_string: str = 'method string'\n\n    def tearDown(self) -\u003e None:\n        \"\"\" Teardown for every test method. \"\"\"\n\n        print('tearDown is calling after every test method.')\n        del self.method_string\n\n    def test_is_title(self) -\u003e None:\n        \"\"\" Test checks if given string is in titled case \"\"\"\n\n        print('calling test_is_title')\n\n        titled_module_string: str = module_string.title()\n        titled_class_string: str = self.class_string.title()\n        titled_method_string: str = self.method_string.title()\n\n        self.assertTrue(titled_module_string.title())\n        self.assertTrue(titled_class_string.title())\n        self.assertTrue(titled_method_string.istitle())\n\n    def test_is_lower(self) -\u003e None:\n        \"\"\" Test checks if string is in lower case \"\"\"\n\n        print('calling test_is_lower')\n\n        lower_module_string: str = module_string.lower()\n        lower_class_string: str = self.class_string.lower()\n        lower_method_string: str = self.method_string.lower()\n\n        self.assertTrue(lower_module_string.islower())\n        self.assertTrue(lower_class_string.islower())\n        self.assertTrue(lower_method_string.islower())\n\n    def test_is_upper(self) -\u003e None:\n        \"\"\" Test checks if string is in upper case \"\"\"\n\n        print('calling test_is_upper')\n\n        upper_module_string: str = module_string.upper()\n        upper_class_string: str = self.class_string.upper()\n        upper_method_string: str = self.method_string.upper()\n\n        self.assertTrue(upper_module_string.isupper())\n        self.assertTrue(upper_class_string.isupper())\n        self.assertTrue(upper_method_string.isupper())\n```\n### Additional materials for chapter one\n- [https://docs.python.org/3/library/unittest.html#](https://docs.python.org/3/library/unittest.html#)\n- [https://www.blog.pythonlibrary.org/2016/07/07/python-3-testing-an-intro-to-unittest/](https://www.blog.pythonlibrary.org/2016/07/07/python-3-testing-an-intro-to-unittest/)\n\n## Chapter two (write test suits)\nThis chapter consists basics of unittest test suits usage.\n### Basic test suite example\n```python\n# test_suite.py module\n\nfrom unittest import TestSuite, TestLoader, TextTestRunner\nfrom chapter_one.test_list import TestListMethods  # use test_list.py module from `Basic test case example` section in `chapter_one` puzzle\n\n\ndef _test_suite() -\u003e TestSuite:\n    test_suite: TestSuite = TestSuite()\n    tests :TestLoader = TestLoader().loadTestsFromTestCase(TestListMethods)\n    test_suite.addTests(tests)\n    return test_suite\n\n\nif __name__ == '__main__':\n    test_runner: TextTestRunner = TextTestRunner(verbosity=2)\n    test_runner.run(_test_suite())\n```\n### Run test suite\n```bash\n# Run test suite - test_suite.py test module\n~/unittest-bootcamp/chapter_two python test_suite.py\n```\n### Prepare test cases for next grouping into test suite\n```python\n# test_filter.py module\n\nfrom typing import List\nfrom unittest import TestCase\n\n\nclass TestFilterOddNumbers(TestCase):\n    \"\"\" This test case filters odd numbers from a given sequence \"\"\"\n\n    def test_with_basic_algorithm(self) -\u003e None:\n        \"\"\" Test checks if odd numbers are filtered with basic algorithm \"\"\"\n\n        odds: List[...] = list()\n        for n in range(1, 6):\n            if n % 2 != 0:\n                odds.append(n)\n        self.assertListEqual(odds, [1, 3, 5])\n\n    def test_with_list_comprehension(self):\n        \"\"\" Test checks if odd numbers are filtered with list comprehension \"\"\"\n\n        self.assertListEqual([n for n in range(1, 6) if n % 2 != 0], [1, 3, 5])\n\n    def test_with_filter_function(self) -\u003e None:\n        \"\"\" Test checks if odd numbers are filtered with 'filter' function \"\"\"\n\n        def check_odds(n: int) -\u003e bool:\n            if not n % 2:\n                return False\n            return True\n\n        self.assertListEqual(list(filter(check_odds, range(1, 6))), [1, 3, 5])\n\n\nclass TestFilterEvenNumbers(TestCase):\n    \"\"\" This test case filters even numbers from a given sequence \"\"\"\n\n    def test_with_basic_algorithm(self) -\u003e None:\n        \"\"\" Test checks if even numbers are filtered with basic algorithm \"\"\"\n\n        odds: List[...] = list()\n        for n in range(1, 6):\n            if n % 2 == 0:\n                odds.append(n)\n        self.assertListEqual(odds, [2, 4])\n\n    def test_with_list_comprehension(self):\n        \"\"\" Test checks if even numbers are filtered with list comprehension \"\"\"\n\n        self.assertListEqual([n for n in range(1, 6) if n % 2 == 0], [2, 4])\n\n    def test_with_filter_function(self) -\u003e None:\n        \"\"\" Test checks if even numbers are filtered with 'filter' function \"\"\"\n\n        def check_evens(n: int) -\u003e bool:\n            if n % 2:\n                return False\n            return True\n\n        self.assertListEqual(list(filter(check_evens, range(1, 6))), [2, 4])\n```\n### Group test cases into one test suite\n```bash\n# test_filter_suite.py module\n\nfrom unittest import TestSuite, TestLoader, TextTestRunner\nfrom chapter_two.test_filter import TestFilterOddNumbers, TestFilterEvenNumbers\n\n\ndef _test_suite() -\u003e TestSuite:\n    test_suite: TestSuite = TestSuite()\n    for test_case in TestFilterOddNumbers, TestFilterEvenNumbers:\n        tests: TestLoader = TestLoader().loadTestsFromTestCase(test_case)\n        test_suite.addTests(tests)\n    return test_suite\n\n\nif __name__ == '__main__':\n    test_runner: TextTestRunner = TextTestRunner(verbosity=2)\n    test_runner.run(_test_suite())\n```\n### Group separate tests into one test suite\n```python\n# test_filter_suite_separate_tests.py module\n\nfrom unittest import TestSuite, TextTestRunner\nfrom chapter_two.test_filter import TestFilterOddNumbers, TestFilterEvenNumbers\n\n\ndef _test_suite() -\u003e TestSuite:\n    test_suite: TestSuite = TestSuite()\n    for test_case in TestFilterOddNumbers, TestFilterEvenNumbers:\n        test_suite.addTest(test_case('test_with_basic_algorithm'))\n        test_suite.addTest(test_case('test_with_list_comprehension'))\n    return test_suite\n\n\nif __name__ == '__main__':\n    test_runner: TextTestRunner = TextTestRunner(verbosity=2)\n    test_runner.run(_test_suite())\n```\n### Group multiple test suite into one top level test suite\n```python\n# test_filter_suites.py module\n\nfrom unittest import TestSuite, TestLoader, TextTestRunner\nfrom chapter_two.test_filter import TestFilterOddNumbers, TestFilterEvenNumbers\n\n\ndef _test_suite() -\u003e TestSuite:\n    filter_odds_suite: TestLoader = TestLoader().loadTestsFromTestCase(TestFilterOddNumbers)\n    filter_evens_suite: TestLoader = TestLoader().loadTestsFromTestCase(TestFilterEvenNumbers)\n    top_filter_suite: TestSuite = TestSuite([filter_odds_suite, filter_evens_suite])\n    return top_filter_suite\n\n\nif __name__ == '__main__':\n    test_runner: TextTestRunner = TextTestRunner(verbosity=2)\n    test_runner.run(_test_suite())\n```\n### Run every grouped test suite\n```bash\n# Run simple test suite\n~/unittest-bootcamp/chapter_two python test_filter_suite.py\n  \n# Run test suite with separate tests from test cases\n~/unittest-bootcamp/chapter_two python test_filter_suite_with_separate_tests.py\n  \n# Run top level test suite\n~/unittest-bootcamp/chapter_two python test_suites.py\n```\n### Additional materials for chapter two\n- [https://docs.python.org/3/library/unittest.html](https://docs.python.org/3/library/unittest.html)\n\n## Contributing\n- clone the repository\n- configure Git for the first time after cloning with your name and email\n  ```bash\n  git config --local user.name \"Volodymyr Yahello\"\n  git config --local user.email \"vyahello@gmail.com\"\n  ```\n- `python3.6` is required to run the code\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvyahello%2Funittest-bootcamp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvyahello%2Funittest-bootcamp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvyahello%2Funittest-bootcamp/lists"}