HTML-отчет о покрытии кода тестами:
Тесты для класса VendingMachine
Исходный код класса VendingMachine
Исходный код класса VendingMachine
с исправлениями
Протестировать функцию
returnMoney
на предмет возвратаTOO_BIG_CHANGE
иUNSUITABLE_CHANGE
, не изменяя поля напрямую, мне представляется невозможным.Протестировать функцию
giveProduct1
на предмет возвратаTOO_BIG_CHANGE
, не изменяя поля напрямую, мне представляется невозможным.Протестировать функцию
giveProduct2
на предмет возвратаTOO_BIG_CHANGE
, не изменяя поля напрямую, мне представляется невозможным.
Для получения отчёта о покрытии кода тестами использовался модуль coverage
, для тестирования - модуль unittest
:
pip3 install coverage
coverage run -m unittest test_VendingMachine.py
coverage html
До исправления:
def getCoins2(self):
if self.__mode == VendingMachine.Mode.OPERATION:
return self.coins1
return self.__coins2
Данные, на которых наблюдается некорректное поведение:
self.__mode = VendingMachine.Mode.OPERATION
self.__coins1 != 0
Ожидаемое поведение: возвращение 0.
Полученное поведение: возвращение self.__coins1
!= 0.
После исправления:
def getCoins2(self):
if self.__mode == VendingMachine.Mode.OPERATION:
return 0
return self.__coins2
До исправления:
def fillProducts(self):
self.__num1 = self.__max2
self.__num2 = self.__max2
return VendingMachine.Response.OK
Данные, на которых наблюдается некорректное поведение:
self.__mode = VendingMachine.Mode.OPERATION
Ожидаемое поведение: возвращение VendingMachine.Response.ILLEGAL_OPERATION
.
Полученное поведение: self.__max2
устанавливается в self.__num1
и self.__num2
соответственно, возвращается VendingMachine.Response.OK
.
После исправления:
def fillProducts(self):
if self.__mode == VendingMachine.Mode.OPERATION:
return VendingMachine.Response.ILLEGAL_OPERATION
self.__num1 = self.__max2
self.__num2 = self.__max2
return VendingMachine.Response.OK
До исправления:
def fillProducts(self):
if self.__mode == VendingMachine.Mode.OPERATION:
return VendingMachine.Response.ILLEGAL_OPERATION
self.__num1 = self.__max2
self.__num2 = self.__max2
return VendingMachine.Response.OK
Данные, на которых наблюдается некорректное поведение:
self.__mode = VendingMachine.Mode.ADMINISTERING
Ожидаемое поведение: self.__max1
и self.__max2
устанавливаются в self.__num1
и self.__num2
соответственно, возвращается VendingMachine.Response.OK
.
Полученное поведение: self.__max2
устанавливается в self.__num1
и self.__num2
соответственно, возвращается VendingMachine.Response.OK
.
После исправления:
def fillProducts(self):
if self.__mode == VendingMachine.Mode.OPERATION:
return VendingMachine.Response.ILLEGAL_OPERATION
self.__num1 = self.__max1
self.__num2 = self.__max2
return VendingMachine.Response.OK
До исправления:
def fillCoins(self, c1: int, c2: int):
if self.__mode == VendingMachine.Mode.OPERATION:
return VendingMachine.Response.ILLEGAL_OPERATION
if c1 <= 0 or c2 > self.__maxc1:
return VendingMachine.Response.INVALID_PARAM
if c1 <= 0 or c2 > self.__maxc2:
return VendingMachine.Response.INVALID_PARAM
self.__coins1 = c1
self.__coins2 = c2
return VendingMachine.Response.OK
Данные, на которых наблюдается некорректное поведение:
self.__mode = VendingMachine.Mode.ADMINISTERING
c2 <= 0 or c1 > self.__maxc1
Ожидаемое поведение: возвращается VendingMachine.Response.INVALID_PARAM
.
Полученное поведение: c1
и c2
устанавливаются в self.__coins1
и self.__coins2
соответственно, возвращается VendingMachine.Response.OK
.
После исправления:
def fillCoins(self, c1: int, c2: int):
if self.__mode == VendingMachine.Mode.OPERATION:
return VendingMachine.Response.ILLEGAL_OPERATION
if c1 <= 0 or c1 > self.__maxc1:
return VendingMachine.Response.INVALID_PARAM
if c2 <= 0 or c2 > self.__maxc2:
return VendingMachine.Response.INVALID_PARAM
self.__coins1 = c1
self.__coins2 = c2
return VendingMachine.Response.OK
До исправления:
def enterAdminMode(self, code: int):
if self.__balance != 0:
return VendingMachine.Response.UNSUITABLE_CHANGE
if code != self.__id:
return VendingMachine.Response.INVALID_PARAM
self.__mode = VendingMachine.Mode.ADMINISTERING
return VendingMachine.Response.OK
Данные, на которых наблюдается некорректное поведение:
self.__balance != 0
Ожидаемое поведение: возвращается VendingMachine.Response.CANNOT_PERFORM
.
Полученное поведение: возвращается VendingMachine.Response.UNSUITABLE_CHANGE
.
После исправления:
def enterAdminMode(self, code: int):
if self.__balance != 0:
return VendingMachine.Response.CANNOT_PERFORM
if code != self.__id:
return VendingMachine.Response.INVALID_PARAM
self.__mode = VendingMachine.Mode.ADMINISTERING
return VendingMachine.Response.OK
До исправления:
def setPrices(self, p1: int, p2: int):
if self.__mode == VendingMachine.Mode.OPERATION:
return VendingMachine.Response.ILLEGAL_OPERATION
self.__price1 = p1
self.__price2 = p2
return VendingMachine.Response.OK
Данные, на которых наблюдается некорректное поведение:
p1 <= 0 or p2 <= 0
Ожидаемое поведение: возвращается VendingMachine.Response.INVALID_PARAM
.
Полученное поведение: p1
и p2
устанавливаются в self.__price1
и self.__price2
соответственно, возвращается VendingMachine.Response.OK
.
После исправления:
def setPrices(self, p1: int, p2: int):
if self.__mode == VendingMachine.Mode.OPERATION:
return VendingMachine.Response.ILLEGAL_OPERATION
if p1 <= 0 or p2 <= 0:
return VendingMachine.Response.INVALID_PARAM
self.__price1 = p1
self.__price2 = p2
return VendingMachine.Response.OK
До исправления:
def putCoin1(self):
if self.__mode == VendingMachine.Mode.ADMINISTERING:
return VendingMachine.Response.ILLEGAL_OPERATION
if self.__coins2 == self.__maxc2:
return VendingMachine.Response.CANNOT_PERFORM
self.__balance += self.__coinval2
self.__coins2 += 1
return VendingMachine.Response.OK
Данные, на которых наблюдается некорректное поведение:
self.__mode == VendingMachine.Mode.OPERATION
self.__coins1 != self.__maxc1
self.__coins2 == self.__maxc2
Ожидаемое поведение: self.__balance
увеличивается на self.__coinval1
, self.__coins1
увеличивается на 1, возвращается VendingMachine.Response.OK
.
Полученное поведение: возвращается VendingMachine.Response.CANNOT_PERFORM
.
После исправления:
def putCoin1(self):
if self.__mode == VendingMachine.Mode.ADMINISTERING:
return VendingMachine.Response.ILLEGAL_OPERATION
if self.__coins1 == self.__maxc1:
return VendingMachine.Response.CANNOT_PERFORM
self.__balance += self.__coinval2
self.__coins2 += 1
return VendingMachine.Response.OK
До исправления:
def putCoin1(self):
if self.__mode == VendingMachine.Mode.ADMINISTERING:
return VendingMachine.Response.ILLEGAL_OPERATION
if self.__coins1 == self.__maxc1:
return VendingMachine.Response.CANNOT_PERFORM
self.__balance += self.__coinval2
self.__coins2 += 1
return VendingMachine.Response.OK
Данные, на которых наблюдается некорректное поведение:
self.__mode == VendingMachine.Mode.OPERATION
self.__coins1 != self.__maxc1
Ожидаемое поведение: self.__balance
увеличивается на self.__coinval1
, self.__coins1
увеличивается на 1, возвращается VendingMachine.Response.OK
.
Полученное поведение: self.__balance
увеличивается на self.__coinval2
, self.__coins2
увеличивается на 1, возвращается VendingMachine.Response.OK
.
После исправления:
def putCoin1(self):
if self.__mode == VendingMachine.Mode.ADMINISTERING:
return VendingMachine.Response.ILLEGAL_OPERATION
if self.__coins1 == self.__maxc1:
return VendingMachine.Response.CANNOT_PERFORM
self.__balance += self.__coinval1
self.__coins1 += 1
return VendingMachine.Response.OK
До исправления:
def putCoin2(self):
if self.__mode == VendingMachine.Mode.ADMINISTERING:
return VendingMachine.Response.ILLEGAL_OPERATION
if self.__coins1 == self.__maxc1:
return VendingMachine.Response.CANNOT_PERFORM
self.__balance += self.__coinval1
self.__coins1 += 1
return VendingMachine.Response.OK
Данные, на которых наблюдается некорректное поведение:
self.__mode == VendingMachine.Mode.OPERATION
self.__coins1 == self.__maxc1
self.__coins2 != self.__maxc2
Ожидаемое поведение: self.__balance
увеличивается на self.__coinval2
, self.__coins2
увеличивается на 1, возвращается VendingMachine.Response.OK
.
Полученное поведение: возвращается VendingMachine.Response.CANNOT_PERFORM
.
После исправления:
def putCoin2(self):
if self.__mode == VendingMachine.Mode.ADMINISTERING:
return VendingMachine.Response.ILLEGAL_OPERATION
if self.__coins2 == self.__maxc2:
return VendingMachine.Response.CANNOT_PERFORM
self.__balance += self.__coinval1
self.__coins1 += 1
return VendingMachine.Response.OK
До исправления:
def putCoin2(self):
if self.__mode == VendingMachine.Mode.ADMINISTERING:
return VendingMachine.Response.ILLEGAL_OPERATION
if self.__coins2 == self.__maxc2:
return VendingMachine.Response.CANNOT_PERFORM
self.__balance += self.__coinval1
self.__coins1 += 1
return VendingMachine.Response.OK
Данные, на которых наблюдается некорректное поведение:
self.__mode == VendingMachine.Mode.OPERATION
self.__coins2 != self.__maxc2
Ожидаемое поведение: self.__balance
увеличивается на self.__coinval2
, self.__coins2
увеличивается на 1, возвращается VendingMachine.Response.OK
.
Полученное поведение: self.__balance
увеличивается на self.__coinval1
, self.__coins1
увеличивается на 1, возвращается VendingMachine.Response.OK
.
После исправления:
def putCoin2(self):
if self.__mode == VendingMachine.Mode.ADMINISTERING:
return VendingMachine.Response.ILLEGAL_OPERATION
if self.__coins2 == self.__maxc2:
return VendingMachine.Response.CANNOT_PERFORM
self.__balance += self.__coinval2
self.__coins2 += 1
return VendingMachine.Response.OK
До исправления:
def giveProduct2(self, number: int):
if self.__mode == VendingMachine.Mode.ADMINISTERING:
return VendingMachine.Response.ILLEGAL_OPERATION
if number <= 0 or number >= self.__max2:
return VendingMachine.Response.INVALID_PARAM
if number > self.__num2:
return VendingMachine.Response.INSUFFICIENT_PRODUCT
res = self.__balance - number * self.__price2
if res < 0:
return VendingMachine.Response.INSUFFICIENT_MONEY
if res > self.__coins1 * self.__coinval1 + self.__coins2 * self.__coinval2:
return VendingMachine.Response.INSUFFICIENT_MONEY
if res > self.__coins2 * self.__coinval2:
# using coinval1 == 1
self.__coins1 -= res - self.__coins2 * self.__coinval2
self.__coins2 = 0
self.__balance = 0
self.__num2 -= number
return VendingMachine.Response.OK
if res % self.__coinval2 == 0:
self.__coins2 -= res / self.__coinval2
self.__balance = 0
self.__num2 -= number
return VendingMachine.Response.OK
if self.__coins1 == 0:
return VendingMachine.Response.UNSUITABLE_CHANGE
self.__coins1 -= res // self.__coinval2
self.__coins2 -= 1
self.__balance = 0
self.__num2 -= number
return VendingMachine.Response.OK
Данные, на которых наблюдается некорректное поведение:
self.__mode == VendingMachine.Mode.OPERATION
number > 0 and number <= self.__num2 and number < self.__max2
self.__balance - number * self.__price2 > self.__coins1 * self.__coinval1 + self.__coins2 * self.__coinval2
Ожидаемое поведение: возвращается VendingMachine.Response.TOO_BIG_CHANGE
.
Полученное поведение: возвращается VendingMachine.Response.INSUFFICIENT_MONEY
.
После исправления:
def giveProduct2(self, number: int):
if self.__mode == VendingMachine.Mode.ADMINISTERING:
return VendingMachine.Response.ILLEGAL_OPERATION
if number <= 0 or number >= self.__max2:
return VendingMachine.Response.INVALID_PARAM
if number > self.__num2:
return VendingMachine.Response.INSUFFICIENT_PRODUCT
res = self.__balance - number * self.__price2
if res < 0:
return VendingMachine.Response.INSUFFICIENT_MONEY
if res > self.__coins1 * self.__coinval1 + self.__coins2 * self.__coinval2:
return VendingMachine.Response.TOO_BIG_CHANGE # return VendingMachine.Response.INSUFFICIENT_MONEY
if res > self.__coins2 * self.__coinval2:
# using coinval1 == 1
self.__coins1 -= res - self.__coins2 * self.__coinval2
self.__coins2 = 0
self.__balance = 0
self.__num2 -= number
return VendingMachine.Response.OK
if res % self.__coinval2 == 0:
self.__coins2 -= res / self.__coinval2
self.__balance = 0
self.__num2 -= number
return VendingMachine.Response.OK
if self.__coins1 == 0:
return VendingMachine.Response.UNSUITABLE_CHANGE
self.__coins1 -= res // self.__coinval2
self.__coins2 -= 1
self.__balance = 0
self.__num2 -= number
return VendingMachine.Response.OK