Generators and tests
Generators
def number_sequence_generator():
a = 0
while True:
yield a
a += 1
Generators are a simple tool for creating iterators
They are just functions with yield instead of return statement whenever they want to return data
Generators
if __name__ == '__main__':
generator = number_sequence_generator()
next(generator) # 0
next(generator) # 1
next(generator) # 2
Each time next() is called on it, the generator resumes where it left off. It remembers all the data values and which statement was last executed
Finite generators
def finite_generator():
for i in range(4):
yield i ** 2
if __name__ == '__main__':
generator = finite_generator()
next(generator) # 0
next(generator) # 1
next(generator) # 4
next(generator) # 9
next(generator) # StopIteration error
Infinite generators
def finite_generator():
a = 0
while True:
yield a ** 2
a += 1
if __name__ == '__main__':
generator = finite_generator()
next(generator) # 0
next(generator) # 1
next(generator) # 4
next(generator) # 9
next(generator) # 16
next(generator) # 25
# ...
Generators
They should be lazy whenever it's possible
for i in range(100000000000):
print(i)
e.g. this will not cause your computer to die in python 3.x. Cause all numbers are generated one after another, not all at once
though it will in python 2.x, therefore xrange should be used in python 2.x
Generator expressions
for i_square in (i ** 2 for i in range(100000000000)):
print(i_square)
Yet more concise way to write iterators
What to read
Why do we need tests
- To be sure that out code does what it's supposed to
- To alleviate the pain of refactoring
- To show other people that our code is reliable
- ...
There are many ways to categorize tests
-
Unit testing
-
Integration testing
-
System testing
-
Sanity testing
-
Smoke testing
-
Regression testing
- Stress testing
Unit testing - test the smallest pieces of functionality, e.g. functions
Libraries for unit tests
- unittest
- doctest
- pytest (not in standard libraries)
unittest
from unittest import TestCase
class SimpleTests(TestCase):
@classmethod
def setUpClass(cls):
print("I'm executed once before all tests in class")
def setUp(self):
print("I'm executed before each test in class")
def test_something(self):
self.assertEqual(1, 2, "Some test comment")
@classmethod
def tearDownClass(cls):
print("I'm executed once after all tests in class")
def setUp(self):
print("I'm executed after each test in class")
Repo with example
What to read
Generators and test python
By Aleksandr Slepchenkov
Generators and test python
- 182