So my first initial change for Parameterizing test-cases was a bit of failure - you can check this Parameterized Django Testcases At Biking Endorphines
Let's change that :)
Prerequisites - How to use Pytests
1. Install pytests with pip :
pip install pytest
2. Import Pytest in your file containing tests:
3. But how do you actually use it ?
That's a good question.
First create a file with different name then
first_test.py and put similar content as I've created :
""" Pytests example """ import pytest def func(num): """ Simple adding function for pytest showcase """ return num + 1 def test_answer_fail(): """ Test for checking func with negative values """ with pytest.raises(AssertionError): assert func(3) == 5 def test_answer_success(): """ Test for checking func with possitive values """ assert func(4) == 5
Then use following bash command:
pytest -rs first_test.py
That should make following output:
pytest -rs first_pytest.py ============================================================================================================ test session starts ============================================================================================================ platform linux2 -- Python 2.7.6, pytest-3.0.7, py-1.4.33, pluggy-0.4.0 rootdir: /home/bawi/projects/deployed/anselmos_blog/data/content/examples/pytest, inifile: collected 2 items first_pytest.py .. ========================================================================================================= 2 passed in 0.02 seconds ==========================================================================================================
What changes I've made in code - a diff between code-commits using asciinema and vim-diff tool?
1. I've followed Good Integration Practices
What that means ? I've figure-out that this tests that I intent to create are out-side of django scope, so why not just put them literally out-side?
That's why I've created tests directory at directory bikingendorphines/tests and put all my test-files in there.
2. Test-Case itself.
Now I've change code so it looks like this :
""" Tests for GPXReader class """ import pytest from web.utils import GPXReader @pytest.fixture( scope='module', params=[ 'bikingendorphines/example_data/15212277.gpx', 'bikingendorphines/example_data/15212277.gpx' ] ) def gpxreader(request): """ Creates GPXReader instance with predefined gpx file """ return GPXReader(request.param) # pylint: disable=redefined-outer-name def test_get_points(gpxreader): """ Tests if there will be data output from get_points. Test if: - points exists for different types. - what will happen if types exists, but no data? """ points =  for point in gpxreader.get_points(): points.append(point) assert len(points) > 0
Check how much my code changed in this commit that shows all diffs:
Code commits done for this post:
That's the same commit that changes GPXReader:
And I've finally Squashed and Merged the gpx-solution as a initial solution.
Now I hope Travis will make my day better and confirm pylint&unittest as a good-to-go and create Pyreverse GH PAGE :)
Update : Yes :) Travis accepted my changes and created pyreverse output in gh-pages, see GH_PAGE, Classes as PNG File
Tools and applications used:
LL (Lessons Learned)
1. Don't try to name your file with test-cases a
pytest.py ! :)
If your filename will have name
pytest.py as I did for my example of usage pytest, I've found python mismatched pytest and was confused.
Error like this popup:
________________________________________________________________________________________________________ ERROR collecting pytest.py _________________________________________________________________________________________________________ import file mismatch: imported module 'pytest' has this __file__ attribute: /home/bawi/projects/deployed/anselmos_blog/data/content/examples/pytest/.env/local/lib/python2.7/site-packages/pytest.py which is not the same as the test file we want to collect: /home/bawi/projects/deployed/anselmos_blog/data/content/examples/pytest/pytest.py HINT: remove __pycache__ / .pyc files and/or use a unique basename for your test file modules
You may overcome this issue change your name to something different than name of the library itself :)
2. Create plan and stick to it
That's more a Tips&Tricks then Lessons Learned, but it may also count as LL. I've figure-out finally how to manage the planning - I'll try my method and let you know if it will actually work:
- Create a .md file for article
- Make only main parts information of article that will briefly describe a kind-of-todo
- Make all of this parts and describe them more deeply.