Use “get” methods to help writing more testable code

Imagine you have the following code def do_something(): users = User.objects.filter(dob__gte='1980-01-01') for user in users: # do something to user If you were writing unit test against do_something(), you would need to do some complex mocking on User.objects.filter() to return some mock up data. But this can be easily prevented by refactoring into a separate… Read More »

Minimal Django script setup

import os, sys, pathlib # if script is in on 1 level deep # sys.path.append(str(pathlib.Path(__file__).parents[1].absolute())) sys.path.append(str(pathlib.Path(__file__).absolute())) os.environ.setdefault("DJANGO_SETTINGS_MODULE", "main.settings") import django django.setup() # import your django models # do your django work

Notes about python logging

Consider the following code import logging logging.info('trying to log something') Executing above: It won’t log anything to console, because it default to level warning It won’t log anything to console, because no stream has been set import logging logging.basicConfig(level=logging.INFO) logging.info('trying to log something') logging.basicConfig(level=logging.DEBUG) logging.debug('trying to log something debug') Executing above: Running basicConfig(…) default adds… Read More »

Good references for writing tests

http://blog.codepipes.com/testing/software-testing-antipatterns.htm The above article talks about some anti-patterns in tests, personally I agree most of them especially anti-pattern on “Treating TDD as a religion”.