[Python Test] Use pytest fixtures to reduce duplicated code across unit tests
In this lesson, you will learn how to implement pytest fixtures. Many unit tests have the same resource requirements. For example, an instantiated object from a class. You will learn how to create the instance of the class one time as a fixture and reuse that object across all your tests. This results in faster tests, eliminates duplicate code, and uses less resources when running your tests.
""" Python class for a self-driving car. Suitable for disrupting automotive industry """ class Car(object): def __init__(self, speed, state): self.speed = speed self.state = state def start(self): self.state = "running" return self.state def turn_off(self): self.state = "off" return self.state def accelerate(self): self.speed += 10 return self.speed def stop(self): self.speed = 0 return self.speed
test:
""" Tests for Car class """ import pytest from car import Car class TestCar(object): """ default scope is "function" which means foreach test, it will have its own scope "module" ref to class itself, so it sharing the same instance """ @pytest.fixture(scope="module") def my_car(self): return Car(0, "off") def test_start(self, my_car): my_car.start() assert my_car.state == "running" def test_turn_off(self, my_car): my_car.turn_off() assert my_car.state == "off" def test_accelerate(self, my_car): my_car.accelerate() assert my_car.speed == 10 """ This one will failed because we are using fixture scope as "module", my_car.speed == 20 """ def test_accelerate1(self, my_car): my_car.accelerate() assert my_car.speed == 10 def test_stop(self, my_car): my_car.stop() assert my_car.speed == 0