Finished chap11

master
Jason Zhu 2020-09-09 23:45:48 +10:00
parent 5756668d9e
commit bf857a7c6c
4 changed files with 139 additions and 46 deletions

View File

@ -122,52 +122,96 @@ List of available assert methods
### A Class to Test ### A Class to Test
* class to be tested in *survey.py* have class `AnonymousSurvey` Steps to write test case:
```python 1. Importing `unittest` module and class to test
class AnonymousSurvey: 2. Creating a test class to inherit from `unittest.TestCase`
"""Collect anonymous answers to a survey questions""" 3. Creating test function under class
1. Create an instance of the class to be tested.
def __init__(self, question): 2. Verify its operation
"""Store a question, and prepare to store response."""
self.question = question e.g.
self.responses = []
* class to be tested in [survey.py](src/chap11/survey.py) have class `AnonymousSurvey`
def show_question(self): * script to use class [language_survey](pcc_2e/chapter_11/language_survey.py)
"""Show the survey question""" * test script as shown below:
print(self.question)
def store_response(self, new_response):
"""Store a single response to the survey"""
self.responses.append(new_response)
def show_results(self):
"""Show all the responses that have been given"""
print("Survey results:")
for response in self.responses:
print(f"- {response}")
```
* script to use `AnonymousSurvey` *language_survey.py*
```python ```python
import unittest
from survey import AnonymousSurvey from survey import AnonymousSurvey
# Define a question, and make a survey. class TestAnonymousSurvey(unittest.TestCase):
question = "What language did you first learn to speak?" """Tests for the class AnonymouseSurvey"""
my_survey = AnonymousSurvey(question)
def test_store_single_response(self):
"""Tests that a single response is stored properly"""
question = "What language did you first learn to speak?"
my_survey = AnonymousSurvey(question)
my_survey.store_response('English')
self.assertIn('English', my_survey.responses)
# Show the questions, and store responses to the question def test_store_three_responses(self):
my_survey.show_question() """Test that three individual responses are stored properly"""
print("Enter 'q' at any time to quit.\n") question = "What language did you first learn to speak?"
while True: my_survey = AnonymousSurvey(question)
response = input("Language: ") responses = ['English', 'Spanish', 'Mandarin']
if response == 'q':
break # Store responses
my_survey.store_response(response) for response in responses:
my_survey.store_response(response)
# Test my_survey operation
for response in responses:
self.assertIn(response, my_survey.responses)
# Show the survey results if __name__ == '__main__':
print("\nThank you to everyone who participate in the survey") unittest.main()
my_survey.show_results()
``` ```
If we want to We can add more test functions to test different scenario. But it's too repetitive. Use `setUp()`
### The setUp() Method
We can use `setUp()` to setup initial states of `self.my_survey`, which can reduce repetitions.
```python
import unittest
from survey import AnonymousSurvey
class TestAnonymousSurvey(unittest.TestCase):
"""Tests for the class AnonymouseSurvey"""
def setUp(self):
"""
Create a survey and a set of responses for use in all test methods.
"""
question = "What language did you first learn to speak?"
self.my_survey = AnonymousSurvey(question)
self.responses = ['English', 'Spanish', 'Mandarin']
def test_store_single_response(self):
"""Test test a single response is stored properly"""
self.my_survey.store_response(self.responses[0])
self.assertIn(self.responses[0], self.my_survey.responses)
def test_store_three_responses(self):
"""Test that three individual responses are stored properly."""
for response in self.responses:
self.my_survey.store_response(response)
for response in self.responses:
self.assertIn(response, self.my_survey.responses)
if __name__ == '__main__':
unittest.main()
```
* Use `setUp()` can make test methods easier to write.
* We can make one set of instances and attributes in `setUp()` and then use these instances in all your test methods.
Note of `unittest`
* When a test case is running, Python prints one character for each unit test as it's completed.
* A passing test prints a dot `.`
* A test that results in an error prints an `E`
* A test that results in failed assertion prints an `F`.
* Hence, we can see a different number of dots and characters on the first line of output when you run your test cases.

View File

@ -0,0 +1,11 @@
class Employee:
def __init__(self, first_name, last_name, annual_salary):
"""Store first name, last name, and annual_salary for a employee"""
self.first_name = first_name
self.last_name = last_name
self.annual_salary = annual_salary
def give_raise(self, raise_mount = 5000):
"""Add amount to annual salary"""
self.annual_salary = self.annual_salary + raise_mount

View File

@ -0,0 +1,25 @@
from multiprocessing.spawn import import_main_path
import unittest
from employee import Employee
class EmployeeTestCase(unittest.TestCase):
"""Test for Employee class"""
def setUp(self):
"""
Create a Employee class and a set of attributes for use in all test methods
"""
self.employee = Employee('Jason', 'Zhu', 3000)
def test_give_default_raise(self):
"""Test default raise"""
self.employee.give_raise()
self.assertEqual(3000+5000, self.employee.annual_salary)
def test_give_custom_raise(self):
"""Test customized raise value"""
self.employee.give_raise(3000)
self.assertEqual(3000+3000, self.employee.annual_salary)
if __name__ == '__main__':
unittest.main()

View File

@ -4,12 +4,25 @@ from survey import AnonymousSurvey
class TestAnonymousSurvey(unittest.TestCase): class TestAnonymousSurvey(unittest.TestCase):
"""Tests for the class AnonymouseSurvey""" """Tests for the class AnonymouseSurvey"""
def test_store_single_response(self): def setUp(self):
"""Tests that a single response is stored properly""" """
Create a survey and a set of responses for use in all test methods.
"""
question = "What language did you first learn to speak?" question = "What language did you first learn to speak?"
my_survey = AnonymousSurvey(question) self.my_survey = AnonymousSurvey(question)
my_survey.store_response('English') self.responses = ['English', 'Spanish', 'Mandarin']
self.assertIn('English', my_survey.responses)
def test_store_single_response(self):
"""Test test a single response is stored properly"""
self.my_survey.store_response(self.responses[0])
self.assertIn(self.responses[0], self.my_survey.responses)
def test_store_three_responses(self):
"""Test that three individual responses are stored properly."""
for response in self.responses:
self.my_survey.store_response(response)
for response in self.responses:
self.assertIn(response, self.my_survey.responses)
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()