how to make a Python Test Driven Development environment automatically


You made it this far and have become the greatest programmer in the world. To follow The Do Not Repeat Yourself (DRY) Principle, I write a program with the commands to make a Python Test Driven Development environment anytime I want so I do not have to remember every step of the process or do them manually.

To review, here are steps I take to make the environment for every project

  1. I pick a name for the project

  2. I make a directory for the project

  3. I change directory to the project

  4. I make a directory for the source code

  5. I make a Python file to hold the source code in the ‘src’ folder

  6. I make a directory for the tests

  7. I make the ‘tests’ folder a Python package

  8. I make a Python file to hold the tests in the ‘tests’ folder

  9. I add the first failing test to the test file

  10. I make a virtual environment

  11. I activate the virtual environment

  12. I upgrade the Python package manager

  13. I make a requirements file for the needed Python packages

  14. I install the packages listed in the requirements file

  15. I run the tests automatically

  16. I open the test file in the editor from the terminal

  17. I make the test pass

  18. then I start working on the project

I want to give one command for the program to do every step except

this way I only need to do 3 steps instead of 18

preview

Here is the program I have by the end of the chapter to automatically make a python test driven development environment, it is only 28 lines of code, with spaces

questions about making a Python Test Driven Development Environment automatically

Here are questions you can answer after going through this chapter


how to make a shell script

  • I go to the terminal and use touch to make an empty file with a name that is easy to remember later. I want the name to also describe the program that will automatically make a Test Driven Development environment for me

    touch makePythonTdd.sh
    

    the terminal goes back to the command line

  • I open makePythonTdd.sh in the editor of the Integrated Development Environment (IDE), then add the commands I use to make a Python Test Driven Development environment for a project

     1#!/bin/bash
     2mkdir magic_again
     3cd magic_again
     4mkdir src
     5touch src/magic_again.py
     6mkdir tests
     7touch tests/__init__.py
     8touch tests/test_magic_again.py
     9python3 -m venv .venv
    10source .venv/bin/activate
    11python3 -m pip install --upgrade pip
    12echo "pytest-watch" > requirements.txt
    13python3 -m pip install --requirement requirements.txt
    14pytest-watch
    

    #!/bin/bash is called a shebang line, it tells the computer to use bash to run this program

  • test_magic_again.py is an empty file because I used touch. I want it to have the text for the first failure so I do not have to open the editor to add the text for it in each project. I use echo instead of touch to make the makePythonTdd.sh program add the text to test_magic_again.py when it makes the file in the tests folder, the same I do with the requirements.txt file

     6mkdir tests
     7touch tests/__init__.py
     8
     9echo "" > tests/test_magic_again.py
    10
    11python3 -m venv .venv
    12source .venv/bin/activate
    
  • I add the text for the test inside the quotes (“”) I just added to makePythonTdd.sh, the way I do with echo when I add "pytest-watch" as text in requirements.txt

    Caution

    Indentation is important in Python, I use 4 spaces as convention in this book, see the Python Style Guide for more

     9echo "import unittest
    10
    11
    12class TestMagic(unittest.TestCase):
    13
    14    def test_failure(self):
    15        self.assertFalse(True)
    16
    17
    18# Exceptions Encountered
    19# AssertionError
    20" > tests/test_magic_again.py
    

how to run a shell script

I go back to the terminal to run the program

makePythonTdd.sh

the terminal shows

command not found: makePythonTdd.sh

I have to tell the computer where the file is

./makePythonTdd.sh

./ is shorthand for this directory which in this case is pumping_python where makePythonTdd.sh is saved. The computer checks a few directories when a command is given. Those directories are where commands like mkdir, cd, tree and echo are saved. The terminal shows

permission denied: ./makePythonTdd.sh

I want to make sure the computer can run the program. I have to make it executable

how to view the permissions of a file

I use ls to check the permissions of the file

ls -l makePythonTdd.sh

-l is the option to show the long listing format which includes permissions for the file

the terminal shows

-rw-r--r-- 1 abcdef ghijk XX Month  Y ZA:BC makePythonTdd.sh

the first 10 characters above are grouped

-    rw-    r--    r--

the groups that have 3 characters show read, write and execute permissions with

  • r for read

  • w for write and

  • x for execute

here is what it means for makePythonTdd.sh

  • the first group tells if this is file or directory : - means this is a regular file, it is not a directory

  • this group shows permissions for the owner of the thing: rw- means the owner of the file can read and write to the file but NOT execute it

  • this group shows permissions for the group of the owner of the thing: r-- means the group can read the file, NOT write to it or execute it

  • this group is for other users: r-- means other users can read the file, NOT write to it or execute it

I want to add execute permissions so I can run the file

how to make a shell script run as a command

  • I change the mode of the file to add executable permissions

    chmod +x makePythonTdd.sh
    

    chmod is a program that changes the mode (permissions) of the given file, the terminal goes back to the command line

  • I list the permissions again with ls

    ls -l makePythonTdd.sh
    

    the terminal shows

    -rwxr-xr-x 1 abcdef ghijk XX Month  Y ZA:BC makePythonTdd.sh
    

    here is what each one of the characters before the folder means

    • - means this is a regular file, it is not a directory

    • rwx means the owner of the file has permissions to read, write to and execute it

    • r-x means the group the owner of the file belongs to has permissions to read and execute the file they cannot write to it, and the second

    • r-x means other users have permissions to read and execute the file, they cannot write to it

  • I try the command again

    ./makePythonTdd.sh
    

    the terminal shows

    ======================================= FAILURES =======================================
    _____________________________ TestMagicAgain.test_failure ______________________________
    
    self = <tests.test_magic_again.TestMagicAgain testMethod=test_failure>
    
        def test_failure(self):
    >       self.assertFalse(True)
    E       AssertionError: True is not false
    
    tests/test_magic_again.py:7: AssertionError
    =============================== short test summary info ================================
    FAILED tests/test_magic_again.py::TestMagic::test_failure - AssertionError: True is not false
    ================================== 1 failed in X.YZs ===================================
    

    Success! I just made a program that can make the magic_again project anytime I want and it automatically does the steps I did manually.

  • I hold ctrl on the keyboard and click on tests/test_magic_again.py to open it in the editor then make the test pass

  • I hit ctrl+c in the terminal to stop the test

  • I want to use makePythonTdd.sh to make another project with a different name. I change magic_again to the name of the new project in the editor

    Note

    The lines that are changing in the code are highlighted

     1#!/bin/bash
     2mkdir more_magic
     3cd more_magic
     4mkdir src
     5touch src/more_magic.py
     6mkdir tests
     7touch tests/__init__.py
     8
     9echo "import unittest
    10
    11
    12class TestMoreMagic(unittest.TestCase):
    13
    14    def test_failure(self):
    15        self.assertFalse(True)
    16
    17
    18# Exceptions Encountered
    19# AssertionError
    20" > tests/test_more_magic.py
    
  • I run makePythonTdd.sh in the terminal to make a project named more_magic

    ./makePythonTdd.sh
    

    the terminal shows AssertionError

    ======================================= FAILURES =======================================
    ______________________________ TestMoreMagic.test_failure ______________________________
    
    self = <tests.test_more_magic.TestMoreMagic testMethod=test_failure>
    
        def test_failure(self):
    >       self.assertFalse(True)
    E       AssertionError: True is not false
    
    tests/test_more_magic.py:7: AssertionError
    =============================== short test summary info ================================
    FAILED tests/test_more_magic.py::TestMoreMagic::test_failure - AssertionError: True is not false
    ================================== 1 failed in X.YZs ===================================
    

    I make the test pass

  • I hit ctrl+c to exit the tests in the terminal

the program works and can make a Python Test Driven Development environment automatically the way I want every time


close the project

  • I close the test_more_magic.py in the editor I had open

  • I exit the tests in the terminal with Ctrl+C on the keyboard

  • I deactivate the virtual environment

    deactivate
    

    the terminal goes back to the command line, (.venv) is no longer on the left side

    .../pumping_python/more_magic
    
  • I change directory to the parent of more_magic

    cd ..
    

    the terminal shows

    .../pumping_python
    

    I am back in the pumping_python directory


review

Computer Programming allows me to take some steps and make them a one line command for the computer to do for me. You have seen a way I can make a Python Test Driven Development environment, with a program to do it on any Linux, Windows or MacOS computers.

How many questions can you answer after going through this chapter?


code from the chapter

Do you want to see all the CODE I typed in this chapter?


what is next?

Here is what we have gone through together so far

Would you like to use makePythonTdd.sh to make a Python Test Driven Development environment to test that an Exception is raised?


please leave a review