Простое линейное поисковое тестирование (python)
Проблема состоит в том, чтобы исправить намеренно неправильный код, чтобы можно было выполнить тесты pyUnit. Ошибки в коде должны быть найдены с помощью тестов, а затем исправлены. Мой последний тест выдает ошибку в коде, но я не могу ее обнаружить!
данный код (с ошибками)
def linear( target, list ):
""" returns the position of target,
if not found returns -1"""
position = 0
if len(list)==0:
return -1
else:
while position <= (len(list)+1):
if target == list[position]:
return position
position += 1
return -1
и мои тесты:
import unittest
# import the module(s) to be tested:
from LinearSearch import *
class TestLinearSearch(unittest.TestCase):
# setUp - run prior to the start of each test case
def setUp(self):
# initialize test fixtures
return
def test_smoke(self):
# very simple test to insure test framework is correct
self.assertTrue(1)
# additional test_xxx methods follow....
def test_emptyList(self):
self.assertEqual(linear(4,[]),-1)
def test_singleChar(self):
self.assertEqual(linear(1,[1]),0)
def test_isInList(self):
self.assertEqual(linear(4,[1,2,3,4,5]),3)
def test_isNotInList(self):
self.assertEqual(linear(8,[1,2,3,4,5]),-1)
if __name__ == '__main__':
unittest.main()
тест, который генерирует мою ошибку, является последним тестом: "test_isNotInList(self)", это ошибка индекса за пределами границ... должен быть достаточно простым, но мне просто нужна небольшая помощь.
1 ответ
В вашем последнем тесте функция обращается к list[5]
, который находится вне диапазона. Это вызывает IndexError
, Самый большой индекс, к которому вы можете получить доступ, не вызывая исключения, на единицу меньше длины списка. Вы можете решить эту проблему, изменив условие вашего while
цикл:
while position < len(list):
Или, что еще лучше, просто перебирайте список напрямую, определяя позицию с помощью enumerate
:
def linear( target, list ):
""" returns the position of target,
if not found returns -1"""
for idx, element in enumerate(list):
if element == target:
return idx
return -1