0

問題は、意図的に正しくないコードを修正して、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)」、それは範囲外のインデックスエラーです...十分に単純なはずですが、少し助けが必要です。

4

1 に答える 1

2

最後のテストでは、関数は にアクセスしますがlist[5]、これは範囲外です。これにより、IndexError. 例外を発生させずにアクセスできる最大のインデックスは、リストの長さよりも 1 少なくなります。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
于 2013-09-16T19:30:04.563 に答える