Простое линейное поисковое тестирование (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
Другие вопросы по тегам