SlideShare a Scribd company logo
Object Oriented Testing
(Unit Testing)
Damian Gordon
Object Oriented Testing
• Unit Testing is concerned with testing small chunks of a
program, for example, testing a single class or a single method.
• Python has a library for unit testing called unittest. It
provides several tools for creating and running unit tests.
Object Oriented Testing
• One of the most important classes in unittest is called
TestCase which provides a set of methods to compare
values, set up tests and clean up after tests are finished.
• To write unit tests, we create a subclass of TestCase and
write individual methods to do the actual testing. Typically we
start all of these methods with the name test.
Object Oriented Testing
• Let’s look at a simple example:
Object Oriented Testing
• Let’s look at a simple example:
import unittest
class CheckNumbers(unittest.TestCase):
def test_int_float(self):
self.assertEqual(1, 1.0)
# END test_int_float
# END CheckNumbers
if __name__ == "__main__":
unittest.main()
# ENDIF
Object Oriented Testing
• Let’s look at a simple example:
import unittest
class CheckNumbers(unittest.TestCase):
def test_int_float(self):
self.assertEqual(1, 1.0)
# END test_int_float
# END CheckNumbers
if __name__ == "__main__":
unittest.main()
# ENDIF
Create a subclass of
the TestCase class
Object Oriented Testing
• Let’s look at a simple example:
import unittest
class CheckNumbers(unittest.TestCase):
def test_int_float(self):
self.assertEqual(1, 1.0)
# END test_int_float
# END CheckNumbers
if __name__ == "__main__":
unittest.main()
# ENDIF
Create a subclass of
the TestCase class
This test checks if the
integer and real
value 1 are equal.
Object Oriented Testing
• Let’s look at a simple example:
import unittest
class CheckNumbers(unittest.TestCase):
def test_int_float(self):
self.assertEqual(1, 1.0)
# END test_int_float
# END CheckNumbers
if __name__ == "__main__":
unittest.main()
# ENDIF
Make sure this is
being run as a script
Create a subclass of
the TestCase class
This test checks if the
integer and real
value 1 are equal.
Object Oriented Testing
• And if we run this, we get:
Object Oriented Testing
• And if we run this, we get:
.
-------------------------------------------------
Ran 1 test in 0.020s
OK
Object Oriented Testing
• And if we run this, we get:
.
-------------------------------------------------
Ran 1 test in 0.020s
OK
Dot means the test has passed
Object Oriented Testing
• Let’s try another example:
Object Oriented Testing
• Let’s try another example:
import unittest
class CheckNumbers(unittest.TestCase):
def test_string_float(self):
self.assertEqual(“1”, 1.0)
# END test_string_float
# END CheckNumbers
if __name__ == "__main__":
unittest.main()
# ENDIF
Object Oriented Testing
• Let’s try another example:
import unittest
class CheckNumbers(unittest.TestCase):
def test_string_float(self):
self.assertEqual(“1”, 1.0)
# END test_string_float
# END CheckNumbers
if __name__ == "__main__":
unittest.main()
# ENDIF
This test checks if the
string and real value
1 are equal.
Object Oriented Testing
• And if we run this, we get:
Object Oriented Testing
• And if we run this, we get:
F
=========================================================
FAIL: test_string_float (__main__.CheckNumbers)
This test checks if the string and real value 1 are equal.
--------------------------------------------------------
Traceback (most recent call last):
File "C:/Users/damian/AppData/Local/Programs/Python/Python35-
32/CheckNumbers-string-float.py", line 9, in test_string_float
self.assertEqual("1", 1.0)
AssertionError: '1' != 1.0
--------------------------------------------------------
Ran 1 test in 0.060s
FAILED (failures=1)
Object Oriented Testing
• And if we run this, we get:
F
=========================================================
FAIL: test_string_float (__main__.CheckNumbers)
This test checks if the string and real value 1 are equal.
--------------------------------------------------------
Traceback (most recent call last):
File "C:/Users/damian/AppData/Local/Programs/Python/Python35-
32/CheckNumbers-string-float.py", line 9, in test_string_float
self.assertEqual("1", 1.0)
AssertionError: '1' != 1.0
--------------------------------------------------------
Ran 1 test in 0.060s
FAILED (failures=1)
“F” means the test has failed
Object Oriented Testing
• Let’s combine the two tests together:
Object Oriented Testing
• Let’s combine the two tests together:
import unittest
class CheckNumbers(unittest.TestCase):
if __name__ == "__main__":
unittest.main()
# ENDIF
def test_int_float(self):
self.assertEqual(1, 1.0)
# END test_int_float
def test_string_float(self):
self.assertEqual(“1”, 1.0)
# END test_string_float
Object Oriented Testing
• And if we run this, we get:
Object Oriented Testing
• And if we run this, we get:
.F
=================================================================
FAIL: test_string_float (__main__.CheckNumbers)
---------------------------=-------------------------------------
Traceback (most recent call last):
File "C:UsersdamianAppDataLocalProgramsPythonPython35-
32CheckNumbers.py", line 10, in test_string_float
self.assertEqual("1", 1.0)
AssertionError: '1' != 1.0
-----------------------------------------------------------------
Ran 2 tests in 0.010s
FAILED (failures=1)
Object Oriented Testing
• And if we run this, we get:
.F
=================================================================
FAIL: test_string_float (__main__.CheckNumbers)
---------------------------=-------------------------------------
Traceback (most recent call last):
File "C:UsersdamianAppDataLocalProgramsPythonPython35-
32CheckNumbers.py", line 10, in test_string_float
self.assertEqual("1", 1.0)
AssertionError: '1' != 1.0
-----------------------------------------------------------------
Ran 2 tests in 0.010s
FAILED (failures=1)
“.F” means the first test passed and the
second test has failed
Assertion Methods
Object Oriented Testing
• A test case typically sets certain variables to known values, runs
one or more methods or processes, and then show that correct
expected results were returned by using TestCase assertion
methods.
• There are a few different assertion methods available to confirm
that specific results have been achieved. We already saw
assertEqual, which will cause a test failure if the two
parameters do not pass an equality check. The inverse,
assertNotEqual, will fail if the two parameters do compare as
equal.
Object Oriented Testing
• The assertTrue and assertFalse methods each accept
a single expression, and fail if the expression does not pass an
IF test. These tests are not checking for the Boolean values
True or False, but instead:
– To pass the assertFalse method the test should return False,
None, 0, or an empty list, dictionary, string, set, or tuple.
– To pass the assertFalse method the test should return True,
non-zero numbers, containers with values in.
Methods Description
assertEqual
assertNotEqual
Accept two comparable objects and ensure the named equality
holds.
assertTrue
assertFalse
Accept a single expression, and fail if the expression does not
pass an IF test.
assertGreater
assertGreaterEqual
assertLess
assertLessEqual
Accept two comparable objects and ensure the named
inequality holds.
asssertIn
assertNotIn
Ensure an element is (or is not) an element in a container
object.
assertIsNone
assertIsNotNone
Ensure an element is (or is not) the exact value None (but not
another false value).
assertSameElements Ensure two container objects have the same elements, ignoring
the order.
assertSequenceEqualassertDictEqual
assertSetEqual
assertListEqual
assertTupleEqual
Ensure two containers have the same elements in the same
order. If there's a failure, show a code diff comparing the two
lists to see where they differ. The last four methods also test the
type of the list.
assertRaises Ensure that a specific function call raises a specific exception.
Object Oriented Testing
• Let’s look at the assertRaises method in a bit more detail.
• This method can be used to ensure a specific function call
raises a specific exception. The test passes if the code inside
the with statement raises the proper exception; otherwise, it
fails.
Object Oriented Testing
• Let’s look at an example:
Object Oriented Testing
• Let’s look at an example:
import unittest
def MyAverage(seq):
return sum(seq) / len(seq)
# END average
Continued 
• Let’s look at an example:
Object Oriented Testing
class TestAverage(unittest.TestCase):
def test_zero(self):
self.assertRaises(ZeroDivisionError, MyAverage, [])
# END test_zero
def test_with_zero(self):
with self.assertRaises(ZeroDivisionError):
MyAverage([])
# END test_with_zero
# END CLASS TestAverage
Continued 
 Continued
• Let’s look at an example:
Object Oriented Testing
class TestAverage(unittest.TestCase):
def test_zero(self):
self.assertRaises(ZeroDivisionError, MyAverage, [])
# END test_zero
def test_with_zero(self):
with self.assertRaises(ZeroDivisionError):
MyAverage([])
# END test_with_zero
# END CLASS TestAverage
Continued 
 Continued
We can test if a call to
MyAverage gives an error is
a blank list is passed in
• Let’s look at an example:
Object Oriented Testing
class TestAverage(unittest.TestCase):
def test_zero(self):
self.assertRaises(ZeroDivisionError, MyAverage, [])
# END test_zero
def test_with_zero(self):
with self.assertRaises(ZeroDivisionError):
MyAverage([])
# END test_with_zero
# END CLASS TestAverage
Continued 
 Continued
We can test if a call to
MyAverage gives an error is
a blank list is passed in
The same test, but calling the
method directly, which will
return a divide-by-zero error,
so we need to use the with
statement to tidy up.
Object Oriented Testing
• Let’s look at an example:
if __name__ == "__main__":
unittest.main()
# ENDIF
 Continued
Object Oriented Testing
• Now let’s look at a more detailed example.
• Let’s look at a program, and it’s test program:
Stats.py Stats-test.py
class StatsList class TestValidInputs
def mean
def median
def mode
def test_mean
def test_median
def test_mode
Object Oriented Testing
• Here’s stats.py:
from collections import defaultdict
class StatsList(list):
def mean(self):
return sum(self) / len(self)
# END mean
Continued 
• Here’s stats.py:
Object Oriented Testing
Continued 
 Continued
def median(self):
if len(self) % 2:
return self[int(len(self) / 2)]
else:
idx = int(len(self) / 2)
return (self[idx] + self[idx-1]) / 2
# ENDIF
# END median
• Here’s stats.py:
Object Oriented Testing
 Continued
def mode(self):
freqs = defaultdict(int)
for item in self:
freqs[item] += 1
mode_freq = max(freqs.values())
modes = []
for item, value in freqs.items():
if value == mode_freq:
modes.append(item)
# ENDIF
# ENDFOR
return modes
# END mode
Object Oriented Testing
• We are going to test this program by creating a new file with
our testing code in it.
• So we’ll import unittest, and use the TestCase class
from it, to create a setUp method to do initialization for each
test.
• The setUp method accepts no arguments, and allows us to do
arbitrary setup before each test is run.
Object Oriented Testing
• Here’s stats-test.py:
from stats import StatsList
import unittest
class TestValidInputs(unittest.TestCase):
def setUp(self):
self.stats = StatsList([1,2,2,3,3,4])
# END setUp
Continued 
Object Oriented Testing
• Here’s stats-test.py:
from stats import StatsList
import unittest
class TestValidInputs(unittest.TestCase):
def setUp(self):
self.stats = StatsList([1,2,2,3,3,4])
# END setUp
Continued 
Import the program we’ve just
created, and it’s main class.
Object Oriented Testing
• Here’s stats-test.py:
from stats import StatsList
import unittest
class TestValidInputs(unittest.TestCase):
def setUp(self):
self.stats = StatsList([1,2,2,3,3,4])
# END setUp
Continued 
Import the program we’ve just
created, and it’s main class.
Import unittest.
Object Oriented Testing
• Here’s stats-test.py:
from stats import StatsList
import unittest
class TestValidInputs(unittest.TestCase):
def setUp(self):
self.stats = StatsList([1,2,2,3,3,4])
# END setUp
Continued 
Import the program we’ve just
created, and it’s main class.
Import unittest.
Create the setup method, to
set up values to be tested.
• Here’s stats-test.py:
Object Oriented Testing
Continued 
 Continued
def test_mean(self):
self.assertEqual(self.stats.mean(), 2.5)
# END test_mean
• Here’s stats-test.py:
Object Oriented Testing
Continued 
 Continued
def test_median(self):
self.assertEqual(self.stats.median(), 2.5)
self.stats.append(4)
self.assertEqual(self.stats.median(), 3)
# END test_median
• Here’s stats-test.py:
Object Oriented Testing
 Continued
def test_mode(self):
self.assertEqual(self.stats.mode(), [2,3])
self.stats.remove(2)
self.assertEqual(self.stats.mode(), [3])
# END test_mode
Object Oriented Testing
• And if we run this, we get:
Object Oriented Testing
• And if we run this, we get:
...
----------------------------------------------------------
Ran 3 tests in 0.050s
OK
Object Oriented Testing
• And if we run this, we get:
...
----------------------------------------------------------
Ran 3 tests in 0.050s
OK
“…” means all three tests have passed
Object Oriented Testing
• The setUp method is never explicitly called inside any of the
three test_* methods, the test suite does the call.
• Also note that test_median alters the list, by adding a “4”
to it, yet when test_mode is called, the list has returned to
the values specified in setUp. This shows that setUp is called
individually before each test, to ensure the test class starts
with a clean slate. Tests can be executed in any order, and the
results of one test should not depend on any other tests.
Object Oriented Testing
• TestCase also offers a no-argument tearDown method, which
can be used for cleaning up after each and every test on the class
has run.
• This is useful, for example, if we are testing code that does file I/O,
our tests may create new files as a side effect of testing; the
tearDown method can remove these files and ensure the system
is in the same state it was before the tests ran.
• Test cases should never have side effects.
etc.

More Related Content

PDF
java ppt.pdf
PPTX
Hash table in java
PDF
Python programming : Classes objects
PPTX
Java awt (abstract window toolkit)
PPTX
JavaScript Conditional Statements
PPT
Java awt
PPSX
Dr. Rajeshree Khande :Introduction to Java AWT
PDF
Exception handling
java ppt.pdf
Hash table in java
Python programming : Classes objects
Java awt (abstract window toolkit)
JavaScript Conditional Statements
Java awt
Dr. Rajeshree Khande :Introduction to Java AWT
Exception handling

What's hot (20)

PPSX
ADO.NET
PPTX
Unit Tests And Automated Testing
PDF
Finally, easy integration testing with Testcontainers
PPTX
Conditions In C# C-Sharp
PPTX
What Are Coroutines In Kotlin?
PPT
Android - Android Intent Types
PDF
Design and analysis of algorithms
PPSX
Collections - Lists, Sets
PPTX
Namespaces in C#
PPT
PPTX
Abstraction and Encapsulation
PPTX
J2EE Patterns
PPTX
Object oriented programming with python
PPTX
class and objects
PPTX
Exception handling in JAVA
PDF
C programming session6
PPTX
Properties and indexers in C#
PPTX
Exception handling in Java
PDF
What is objectives of software testing
ADO.NET
Unit Tests And Automated Testing
Finally, easy integration testing with Testcontainers
Conditions In C# C-Sharp
What Are Coroutines In Kotlin?
Android - Android Intent Types
Design and analysis of algorithms
Collections - Lists, Sets
Namespaces in C#
Abstraction and Encapsulation
J2EE Patterns
Object oriented programming with python
class and objects
Exception handling in JAVA
C programming session6
Properties and indexers in C#
Exception handling in Java
What is objectives of software testing
Ad

Viewers also liked (20)

PPTX
Python: Modules and Packages
PPTX
Python: Migrating from Procedural to Object-Oriented Programming
PPT
How to Program
PPTX
Python: Basic Inheritance
PPTX
Python: Object-oriented Testing
PPTX
Python: The Iterator Pattern
PPTX
Python: Multiple Inheritance
PPTX
Python: Common Design Patterns
PPTX
Operating Systems: Virtual Memory
PPTX
Operating Systems: Memory Management
PPT
Testing of Object-Oriented Software
PPT
Use of Specularities and Motion in the Extraction of Surface Shape
PPTX
The Use of Behavioural Economics to Encourage First-Year Completion and Reten...
PPTX
A Compendium of Creativity Tools
PPT
Concepts from Random Words
PPTX
Creative Commons Sites
PPT
Diagrams of the 2009 Claremont Report
PPTX
The Only Way is Ethics
PPTX
Python: Third-Party Libraries
PPT
Computer Vision: Reflectance Analysis for Image Understanding
Python: Modules and Packages
Python: Migrating from Procedural to Object-Oriented Programming
How to Program
Python: Basic Inheritance
Python: Object-oriented Testing
Python: The Iterator Pattern
Python: Multiple Inheritance
Python: Common Design Patterns
Operating Systems: Virtual Memory
Operating Systems: Memory Management
Testing of Object-Oriented Software
Use of Specularities and Motion in the Extraction of Surface Shape
The Use of Behavioural Economics to Encourage First-Year Completion and Reten...
A Compendium of Creativity Tools
Concepts from Random Words
Creative Commons Sites
Diagrams of the 2009 Claremont Report
The Only Way is Ethics
Python: Third-Party Libraries
Computer Vision: Reflectance Analysis for Image Understanding
Ad

Similar to Python: Object-Oriented Testing (Unit Testing) (20)

ODP
Python unit testing
PDF
PresentationqwertyuiopasdfghUnittest.pdf
ODT
Testing in-python-and-pytest-framework
PDF
MT_01_unittest_python.pdf
PDF
Python Advanced – Building on the foundation
PDF
New and improved: Coming changes to the unittest module
PPTX
Coursbjjhuihiuyiyiyuyuiyiuyoilidnes.pptx
PPTX
Python Programming Essentials - M39 - Unit Testing
PDF
Python and test
PDF
Unit Testing in Python
PDF
Python Testing Fundamentals
PPTX
unittestinginpythonfor-PYDevelopers.pptx
PDF
Test and refactoring
PPTX
2.Python_Unit _Testing_Using_PyUnit_Pytest.pptx
PPTX
1.Python_Testing_Using_PyUnit_Pytest.pptx
PPTX
Introduction to unit testing in python
PDF
How to fake_properly
PDF
Debug - MITX60012016-V005100
PPT
Python testing
PDF
Pragmatic Introduction to Python Unit Testing (PyDays 2018)
Python unit testing
PresentationqwertyuiopasdfghUnittest.pdf
Testing in-python-and-pytest-framework
MT_01_unittest_python.pdf
Python Advanced – Building on the foundation
New and improved: Coming changes to the unittest module
Coursbjjhuihiuyiyiyuyuiyiuyoilidnes.pptx
Python Programming Essentials - M39 - Unit Testing
Python and test
Unit Testing in Python
Python Testing Fundamentals
unittestinginpythonfor-PYDevelopers.pptx
Test and refactoring
2.Python_Unit _Testing_Using_PyUnit_Pytest.pptx
1.Python_Testing_Using_PyUnit_Pytest.pptx
Introduction to unit testing in python
How to fake_properly
Debug - MITX60012016-V005100
Python testing
Pragmatic Introduction to Python Unit Testing (PyDays 2018)

More from Damian T. Gordon (20)

PPTX
Introduction to Prompts and Prompt Engineering
PPTX
Introduction to Vibe Coding and Vibe Engineering
PPTX
TRIZ: Theory of Inventive Problem Solving
PPTX
Some Ethical Considerations of AI and GenAI
PPTX
Some Common Errors that Generative AI Produces
PPTX
The Use of Data and Datasets in Data Science
PPTX
A History of Different Versions of Microsoft Windows
PPTX
Writing an Abstract: A Question-based Approach
PPTX
Using GenAI for Universal Design for Learning
DOC
A CheckSheet for Inclusive Software Design
PPTX
A History of Versions of the Apple MacOS
PPTX
68 Ways that Data Science and AI can help address the UN Sustainability Goals
PPTX
Copyright and Creative Commons Considerations
PPTX
Exam Preparation: Some Ideas and Suggestions
PPTX
Studying and Notetaking: Some Suggestions
PPTX
The Growth Mindset: Explanations and Activities
PPTX
Hyperparameter Tuning in Neural Networks
PPTX
Early 20th Century Modern Art: Movements and Artists
PPTX
An Introduction to Generative Artificial Intelligence
PPTX
An Introduction to Green Computing with a fun quiz.
Introduction to Prompts and Prompt Engineering
Introduction to Vibe Coding and Vibe Engineering
TRIZ: Theory of Inventive Problem Solving
Some Ethical Considerations of AI and GenAI
Some Common Errors that Generative AI Produces
The Use of Data and Datasets in Data Science
A History of Different Versions of Microsoft Windows
Writing an Abstract: A Question-based Approach
Using GenAI for Universal Design for Learning
A CheckSheet for Inclusive Software Design
A History of Versions of the Apple MacOS
68 Ways that Data Science and AI can help address the UN Sustainability Goals
Copyright and Creative Commons Considerations
Exam Preparation: Some Ideas and Suggestions
Studying and Notetaking: Some Suggestions
The Growth Mindset: Explanations and Activities
Hyperparameter Tuning in Neural Networks
Early 20th Century Modern Art: Movements and Artists
An Introduction to Generative Artificial Intelligence
An Introduction to Green Computing with a fun quiz.

Recently uploaded (20)

PDF
STATICS OF THE RIGID BODIES Hibbelers.pdf
PDF
Insiders guide to clinical Medicine.pdf
PDF
O5-L3 Freight Transport Ops (International) V1.pdf
PDF
Classroom Observation Tools for Teachers
PPTX
Introduction_to_Human_Anatomy_and_Physiology_for_B.Pharm.pptx
PDF
Microbial disease of the cardiovascular and lymphatic systems
PDF
102 student loan defaulters named and shamed – Is someone you know on the list?
PPTX
IMMUNITY IMMUNITY refers to protection against infection, and the immune syst...
PDF
grade 11-chemistry_fetena_net_5883.pdf teacher guide for all student
PDF
Pre independence Education in Inndia.pdf
PPTX
Cell Structure & Organelles in detailed.
PPTX
PPH.pptx obstetrics and gynecology in nursing
PPTX
Cell Types and Its function , kingdom of life
PPTX
Microbial diseases, their pathogenesis and prophylaxis
PPTX
Final Presentation General Medicine 03-08-2024.pptx
PDF
Supply Chain Operations Speaking Notes -ICLT Program
PPTX
BOWEL ELIMINATION FACTORS AFFECTING AND TYPES
PDF
ANTIBIOTICS.pptx.pdf………………… xxxxxxxxxxxxx
PDF
Mark Klimek Lecture Notes_240423 revision books _173037.pdf
PPTX
master seminar digital applications in india
STATICS OF THE RIGID BODIES Hibbelers.pdf
Insiders guide to clinical Medicine.pdf
O5-L3 Freight Transport Ops (International) V1.pdf
Classroom Observation Tools for Teachers
Introduction_to_Human_Anatomy_and_Physiology_for_B.Pharm.pptx
Microbial disease of the cardiovascular and lymphatic systems
102 student loan defaulters named and shamed – Is someone you know on the list?
IMMUNITY IMMUNITY refers to protection against infection, and the immune syst...
grade 11-chemistry_fetena_net_5883.pdf teacher guide for all student
Pre independence Education in Inndia.pdf
Cell Structure & Organelles in detailed.
PPH.pptx obstetrics and gynecology in nursing
Cell Types and Its function , kingdom of life
Microbial diseases, their pathogenesis and prophylaxis
Final Presentation General Medicine 03-08-2024.pptx
Supply Chain Operations Speaking Notes -ICLT Program
BOWEL ELIMINATION FACTORS AFFECTING AND TYPES
ANTIBIOTICS.pptx.pdf………………… xxxxxxxxxxxxx
Mark Klimek Lecture Notes_240423 revision books _173037.pdf
master seminar digital applications in india

Python: Object-Oriented Testing (Unit Testing)

  • 1. Object Oriented Testing (Unit Testing) Damian Gordon
  • 2. Object Oriented Testing • Unit Testing is concerned with testing small chunks of a program, for example, testing a single class or a single method. • Python has a library for unit testing called unittest. It provides several tools for creating and running unit tests.
  • 3. Object Oriented Testing • One of the most important classes in unittest is called TestCase which provides a set of methods to compare values, set up tests and clean up after tests are finished. • To write unit tests, we create a subclass of TestCase and write individual methods to do the actual testing. Typically we start all of these methods with the name test.
  • 4. Object Oriented Testing • Let’s look at a simple example:
  • 5. Object Oriented Testing • Let’s look at a simple example: import unittest class CheckNumbers(unittest.TestCase): def test_int_float(self): self.assertEqual(1, 1.0) # END test_int_float # END CheckNumbers if __name__ == "__main__": unittest.main() # ENDIF
  • 6. Object Oriented Testing • Let’s look at a simple example: import unittest class CheckNumbers(unittest.TestCase): def test_int_float(self): self.assertEqual(1, 1.0) # END test_int_float # END CheckNumbers if __name__ == "__main__": unittest.main() # ENDIF Create a subclass of the TestCase class
  • 7. Object Oriented Testing • Let’s look at a simple example: import unittest class CheckNumbers(unittest.TestCase): def test_int_float(self): self.assertEqual(1, 1.0) # END test_int_float # END CheckNumbers if __name__ == "__main__": unittest.main() # ENDIF Create a subclass of the TestCase class This test checks if the integer and real value 1 are equal.
  • 8. Object Oriented Testing • Let’s look at a simple example: import unittest class CheckNumbers(unittest.TestCase): def test_int_float(self): self.assertEqual(1, 1.0) # END test_int_float # END CheckNumbers if __name__ == "__main__": unittest.main() # ENDIF Make sure this is being run as a script Create a subclass of the TestCase class This test checks if the integer and real value 1 are equal.
  • 9. Object Oriented Testing • And if we run this, we get:
  • 10. Object Oriented Testing • And if we run this, we get: . ------------------------------------------------- Ran 1 test in 0.020s OK
  • 11. Object Oriented Testing • And if we run this, we get: . ------------------------------------------------- Ran 1 test in 0.020s OK Dot means the test has passed
  • 12. Object Oriented Testing • Let’s try another example:
  • 13. Object Oriented Testing • Let’s try another example: import unittest class CheckNumbers(unittest.TestCase): def test_string_float(self): self.assertEqual(“1”, 1.0) # END test_string_float # END CheckNumbers if __name__ == "__main__": unittest.main() # ENDIF
  • 14. Object Oriented Testing • Let’s try another example: import unittest class CheckNumbers(unittest.TestCase): def test_string_float(self): self.assertEqual(“1”, 1.0) # END test_string_float # END CheckNumbers if __name__ == "__main__": unittest.main() # ENDIF This test checks if the string and real value 1 are equal.
  • 15. Object Oriented Testing • And if we run this, we get:
  • 16. Object Oriented Testing • And if we run this, we get: F ========================================================= FAIL: test_string_float (__main__.CheckNumbers) This test checks if the string and real value 1 are equal. -------------------------------------------------------- Traceback (most recent call last): File "C:/Users/damian/AppData/Local/Programs/Python/Python35- 32/CheckNumbers-string-float.py", line 9, in test_string_float self.assertEqual("1", 1.0) AssertionError: '1' != 1.0 -------------------------------------------------------- Ran 1 test in 0.060s FAILED (failures=1)
  • 17. Object Oriented Testing • And if we run this, we get: F ========================================================= FAIL: test_string_float (__main__.CheckNumbers) This test checks if the string and real value 1 are equal. -------------------------------------------------------- Traceback (most recent call last): File "C:/Users/damian/AppData/Local/Programs/Python/Python35- 32/CheckNumbers-string-float.py", line 9, in test_string_float self.assertEqual("1", 1.0) AssertionError: '1' != 1.0 -------------------------------------------------------- Ran 1 test in 0.060s FAILED (failures=1) “F” means the test has failed
  • 18. Object Oriented Testing • Let’s combine the two tests together:
  • 19. Object Oriented Testing • Let’s combine the two tests together: import unittest class CheckNumbers(unittest.TestCase): if __name__ == "__main__": unittest.main() # ENDIF def test_int_float(self): self.assertEqual(1, 1.0) # END test_int_float def test_string_float(self): self.assertEqual(“1”, 1.0) # END test_string_float
  • 20. Object Oriented Testing • And if we run this, we get:
  • 21. Object Oriented Testing • And if we run this, we get: .F ================================================================= FAIL: test_string_float (__main__.CheckNumbers) ---------------------------=------------------------------------- Traceback (most recent call last): File "C:UsersdamianAppDataLocalProgramsPythonPython35- 32CheckNumbers.py", line 10, in test_string_float self.assertEqual("1", 1.0) AssertionError: '1' != 1.0 ----------------------------------------------------------------- Ran 2 tests in 0.010s FAILED (failures=1)
  • 22. Object Oriented Testing • And if we run this, we get: .F ================================================================= FAIL: test_string_float (__main__.CheckNumbers) ---------------------------=------------------------------------- Traceback (most recent call last): File "C:UsersdamianAppDataLocalProgramsPythonPython35- 32CheckNumbers.py", line 10, in test_string_float self.assertEqual("1", 1.0) AssertionError: '1' != 1.0 ----------------------------------------------------------------- Ran 2 tests in 0.010s FAILED (failures=1) “.F” means the first test passed and the second test has failed
  • 24. Object Oriented Testing • A test case typically sets certain variables to known values, runs one or more methods or processes, and then show that correct expected results were returned by using TestCase assertion methods. • There are a few different assertion methods available to confirm that specific results have been achieved. We already saw assertEqual, which will cause a test failure if the two parameters do not pass an equality check. The inverse, assertNotEqual, will fail if the two parameters do compare as equal.
  • 25. Object Oriented Testing • The assertTrue and assertFalse methods each accept a single expression, and fail if the expression does not pass an IF test. These tests are not checking for the Boolean values True or False, but instead: – To pass the assertFalse method the test should return False, None, 0, or an empty list, dictionary, string, set, or tuple. – To pass the assertFalse method the test should return True, non-zero numbers, containers with values in.
  • 26. Methods Description assertEqual assertNotEqual Accept two comparable objects and ensure the named equality holds. assertTrue assertFalse Accept a single expression, and fail if the expression does not pass an IF test. assertGreater assertGreaterEqual assertLess assertLessEqual Accept two comparable objects and ensure the named inequality holds. asssertIn assertNotIn Ensure an element is (or is not) an element in a container object. assertIsNone assertIsNotNone Ensure an element is (or is not) the exact value None (but not another false value). assertSameElements Ensure two container objects have the same elements, ignoring the order. assertSequenceEqualassertDictEqual assertSetEqual assertListEqual assertTupleEqual Ensure two containers have the same elements in the same order. If there's a failure, show a code diff comparing the two lists to see where they differ. The last four methods also test the type of the list. assertRaises Ensure that a specific function call raises a specific exception.
  • 27. Object Oriented Testing • Let’s look at the assertRaises method in a bit more detail. • This method can be used to ensure a specific function call raises a specific exception. The test passes if the code inside the with statement raises the proper exception; otherwise, it fails.
  • 28. Object Oriented Testing • Let’s look at an example:
  • 29. Object Oriented Testing • Let’s look at an example: import unittest def MyAverage(seq): return sum(seq) / len(seq) # END average Continued 
  • 30. • Let’s look at an example: Object Oriented Testing class TestAverage(unittest.TestCase): def test_zero(self): self.assertRaises(ZeroDivisionError, MyAverage, []) # END test_zero def test_with_zero(self): with self.assertRaises(ZeroDivisionError): MyAverage([]) # END test_with_zero # END CLASS TestAverage Continued   Continued
  • 31. • Let’s look at an example: Object Oriented Testing class TestAverage(unittest.TestCase): def test_zero(self): self.assertRaises(ZeroDivisionError, MyAverage, []) # END test_zero def test_with_zero(self): with self.assertRaises(ZeroDivisionError): MyAverage([]) # END test_with_zero # END CLASS TestAverage Continued   Continued We can test if a call to MyAverage gives an error is a blank list is passed in
  • 32. • Let’s look at an example: Object Oriented Testing class TestAverage(unittest.TestCase): def test_zero(self): self.assertRaises(ZeroDivisionError, MyAverage, []) # END test_zero def test_with_zero(self): with self.assertRaises(ZeroDivisionError): MyAverage([]) # END test_with_zero # END CLASS TestAverage Continued   Continued We can test if a call to MyAverage gives an error is a blank list is passed in The same test, but calling the method directly, which will return a divide-by-zero error, so we need to use the with statement to tidy up.
  • 33. Object Oriented Testing • Let’s look at an example: if __name__ == "__main__": unittest.main() # ENDIF  Continued
  • 34. Object Oriented Testing • Now let’s look at a more detailed example. • Let’s look at a program, and it’s test program: Stats.py Stats-test.py class StatsList class TestValidInputs def mean def median def mode def test_mean def test_median def test_mode
  • 35. Object Oriented Testing • Here’s stats.py: from collections import defaultdict class StatsList(list): def mean(self): return sum(self) / len(self) # END mean Continued 
  • 36. • Here’s stats.py: Object Oriented Testing Continued   Continued def median(self): if len(self) % 2: return self[int(len(self) / 2)] else: idx = int(len(self) / 2) return (self[idx] + self[idx-1]) / 2 # ENDIF # END median
  • 37. • Here’s stats.py: Object Oriented Testing  Continued def mode(self): freqs = defaultdict(int) for item in self: freqs[item] += 1 mode_freq = max(freqs.values()) modes = [] for item, value in freqs.items(): if value == mode_freq: modes.append(item) # ENDIF # ENDFOR return modes # END mode
  • 38. Object Oriented Testing • We are going to test this program by creating a new file with our testing code in it. • So we’ll import unittest, and use the TestCase class from it, to create a setUp method to do initialization for each test. • The setUp method accepts no arguments, and allows us to do arbitrary setup before each test is run.
  • 39. Object Oriented Testing • Here’s stats-test.py: from stats import StatsList import unittest class TestValidInputs(unittest.TestCase): def setUp(self): self.stats = StatsList([1,2,2,3,3,4]) # END setUp Continued 
  • 40. Object Oriented Testing • Here’s stats-test.py: from stats import StatsList import unittest class TestValidInputs(unittest.TestCase): def setUp(self): self.stats = StatsList([1,2,2,3,3,4]) # END setUp Continued  Import the program we’ve just created, and it’s main class.
  • 41. Object Oriented Testing • Here’s stats-test.py: from stats import StatsList import unittest class TestValidInputs(unittest.TestCase): def setUp(self): self.stats = StatsList([1,2,2,3,3,4]) # END setUp Continued  Import the program we’ve just created, and it’s main class. Import unittest.
  • 42. Object Oriented Testing • Here’s stats-test.py: from stats import StatsList import unittest class TestValidInputs(unittest.TestCase): def setUp(self): self.stats = StatsList([1,2,2,3,3,4]) # END setUp Continued  Import the program we’ve just created, and it’s main class. Import unittest. Create the setup method, to set up values to be tested.
  • 43. • Here’s stats-test.py: Object Oriented Testing Continued   Continued def test_mean(self): self.assertEqual(self.stats.mean(), 2.5) # END test_mean
  • 44. • Here’s stats-test.py: Object Oriented Testing Continued   Continued def test_median(self): self.assertEqual(self.stats.median(), 2.5) self.stats.append(4) self.assertEqual(self.stats.median(), 3) # END test_median
  • 45. • Here’s stats-test.py: Object Oriented Testing  Continued def test_mode(self): self.assertEqual(self.stats.mode(), [2,3]) self.stats.remove(2) self.assertEqual(self.stats.mode(), [3]) # END test_mode
  • 46. Object Oriented Testing • And if we run this, we get:
  • 47. Object Oriented Testing • And if we run this, we get: ... ---------------------------------------------------------- Ran 3 tests in 0.050s OK
  • 48. Object Oriented Testing • And if we run this, we get: ... ---------------------------------------------------------- Ran 3 tests in 0.050s OK “…” means all three tests have passed
  • 49. Object Oriented Testing • The setUp method is never explicitly called inside any of the three test_* methods, the test suite does the call. • Also note that test_median alters the list, by adding a “4” to it, yet when test_mode is called, the list has returned to the values specified in setUp. This shows that setUp is called individually before each test, to ensure the test class starts with a clean slate. Tests can be executed in any order, and the results of one test should not depend on any other tests.
  • 50. Object Oriented Testing • TestCase also offers a no-argument tearDown method, which can be used for cleaning up after each and every test on the class has run. • This is useful, for example, if we are testing code that does file I/O, our tests may create new files as a side effect of testing; the tearDown method can remove these files and ensure the system is in the same state it was before the tests ran. • Test cases should never have side effects.
  • 51. etc.