V. Testing the code¶
In this section I show how to integrate unit tests into the CI/CD pipeline, and
again we will make use of the ci.yml file. Personally, I like the pytest framework,
and that’s what I will use in this section.
Setting up the test¶
There is only one function to test (fizz_buzz.py), and it is quite simple.
I will put the test_fizzbuzz.py function directly into the root folder. The structure
of the current github project is as follows:
├── fizzbuzz.py
├── .github
│ └── workflows
│ └── ci.yml
├── .gitignore
├── .pre-commit-config.yaml
├── README.md
└── test_fizzbuzz.py
test_fizzbuzz.py contains:
import pytest
from fizzbuzz import fizz_buzz
inputs = [3, 5, 15, 4, 10, 115, 7]
outputs = ["fizz", "buzz", "fizzbuzz", "4", "buzz", "buzz", "7"]
@pytest.mark.parametrize("inp,out", zip(inputs, outputs))
def test_fizzbuzz(inp, out):
assert fizz_buzz(inp) == out
Append the code below to the ci.yml file:
- name: tests
run: pytest
Failing the test¶
Now a new and innovative idea comes to my mind.
Why overcomplicate the code, why do we start from 15? Let’s
sort everything again, the code will like so nice! So, we change the fizzbuzz code
to the following one:
def fizz_buzz(num: int) -> str:
"""This is my great and neat function to solve the famous
Fizz Buzz problem.
:param num: That's the number which we want the answer for
:return: fizz, buzz, fizzbuzz or the number itself
"""
if num % 3 == 0:
return "fizz"
if num % 5 == 0:
return "buzz"
if num % 15 == 0:
return "fizzbuzz"
return str(num)
Great, let’s push and see that one test has failed:
That is, by introducing unit tests into the CI/CD pipeline we were able to catch the
problem before merging pull request into the main branch.
