[ Index | Exercise 5.5 | Exercise 6.1 ]
Objectives:
- Learn how to use Python's unittest module
Files Created: teststock.py
In this exercise, you will explore the basic mechanics of using
Python's unittest
modules.
In previous exercises, you created a file stock.py
that contained
a Stock
class. In a separate file, teststock.py
, define the following
testing code:
# teststock.py
import unittest
import stock
class TestStock(unittest.TestCase):
def test_create(self):
s = Stock('GOOG', 100, 490.1)
self.assertEqual(s.name, 'GOOG')
self.assertEqual(s.shares, 100)
self.assertEqual(s.price, 490.1)
if __name__ == '__main__':
unittest.main()
Make sure you can run the file:
bash % python3 teststock.py
.
------------------------------------------------------------------```
Ran 1 tests in 0.001s
OK
bash %
Using the code in teststock.py
as a guide, extend the TestStock
class
with tests for the following:
- Test that you can create a
Stock
using keyword arguments such asStock(name='GOOG',shares=100,price=490.1)
. - Test that the
cost
property returns a correct value - Test that the
sell()
method correctly updates the shares. - Test that the
from_row()
class method creates a new instance from good data. - Test that the
__repr__()
method creates a proper representation string. - Test the comparison operator method
__eq__()
Suppose you wanted to write a unit test that checks for an exception. Here is how you can do it:
class TestStock(unittest.TestCase):
...
def test_bad_shares(self):
s = stock.Stock('GOOG', 100, 490.1)
with self.assertRaises(TypeError):
s.shares = '50'
...
Using this test as a guide, write unit tests for the following failure modes:
- Test that setting
shares
to a string raises aTypeError
- Test that setting
shares
to a negative number raises aValueError
- Test that setting
price
to a string raises aTypeError
- Test that setting
price
to a negative number raises aValueError
- Test that setting a non-existent attribute
share
raises anAttributeError
In total, you should have around a dozen unit tests when you're done.
Important Note
For later use in the course, you will want to have a fully working
stock.py
and teststock.py
file. Save your work in progress if you
have to, but you are strongly encouraged to copy the code from
Solutions/5_6
if things are still broken at this point.
We're going to use the teststock.py
file as a tool for improving the Stock
code
later. You'll want it on hand to make sure that the new code behaves the same way
as the old code.
[ Solution | Index | Exercise 5.5 | Exercise 6.1 ]
>>>
Advanced Python Mastery
...
A course by dabeaz
...
Copyright 2007-2023
. This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License