I come from (lately) Ruby, Java and Clojure and currently I’m working with some python projects and I was missing the way I used to test my code
with rspec. After a quick research, I found three great projects that helps to make more readable tests, they are: py.test, Mock and sure.
I was missing a better way to make asserts into my tests. The option about using the plain assert is good but not enough and by using sure I could do some awesome code
looking similar to rspec.
#instead of plain old assert assert add(1, 4) == 5 #I'm empowered by add(1, 4).should.be.equals(5) .should.be.empty ['chip8', 'schip8', 'chip16'].shouldnt.be.empty [1, 2, 3, 4].should.have.length_of(4)
And this makes all the difference, my test code now is more expressive.
Struggling with monkeypatch
The other challenge I was facing was to understand and use monkeypatch for mocks and stubs. I find easier to use the Mock library even though its @patch looks similar to monkeypatch but I could grasp it quickly.
#Stubing def test_simple_math_remotely_stubed(): server = Mock() server.computes_add = Mock(return_value=3) add_remotely(1, 2, server).should.be.equals(3) #Mocking def test_simple_math_remotely_mocked(): server = Mock() add_remotely(1, 2, server) server.computes_add.assert_called_once_with(1, 2) #Stubing an internal dependency @patch('cmath.nasa.random') def test_simple_math_with_randon_generated_by_nasa(nasa_random_generator): nasa_random_generator.configure_mock(return_value=42) add_and_sum_with_rnd(3, 9).should.be.equals(54) #Mocking an internal dependency @patch('cmath.mailer.send') def test_simple_math_that_sends_email(mailer_mock): add_and_sends_email(3, 9) mailer_mock.assert_called_once_with( email@example.com', subject='Complex addition', body='The result was 12')
Make sure you
- Are using virtualenv for better lib version managment
- Have installed pytest, sure and mock
- Git cloned the project above to understand it.