пятница, 20 сентября 2013 г.

Вывести список чисел Фибоначчи и проверить unittest-ом

Задача. Напишите функцию, которая принимает на вход индекс числа в ряде Фибоначчи (0, 1, 1, 2, 3, 5, 8, 13, 21, ... - последующее число равно сумме двух предыдущих), а выводит список чисел этого ряда с 0 до указанного индекса включительно.
Пример:
get_fibonacci_list(0) вернет [0]
get_fibonacci_list(1) вернет [0, 1]
get_fibonacci_list(3) вернет [0, 1, 1, 2]


Решение:
Создадим файл fib.py:
# -*- coding:utf-8 -*-

def get_fibonacci(index):
    if index == 0:
        return 0
    if index == 1:
        return 1
    return get_fibonacci(index-1) + get_fibonacci(index-2)
    
def get_fibonacci_list(last_index):
    if last_index < 0:
        return False
    list = []
    for index in xrange(last_index+1):
        list.append(get_fibonacci(index))
    return list

Здесь функция get_fibobacci() выводит число ряда Фибоначчи по указанному индексу. Обратите внимание, что здесь используется рекурсивный вызов - т.е. функция вызывает саму себя.
Теперь нам нужно проверить работу кода. Для этого используем встроенный в python модуль unittest. Создадим файл test_fib.py:
# -*- coding:utf-8 -*-

import unittest

# Импортируем наш файл, где расположена тестируемая функция
import fib

class Test(unittest.TestCase):
    # Удобное для вас название Теста 1
    def test_get_fibbonaci(self):
        self.assertEqual(fib.get_fibonacci_list(0), [0])
        self.assertEqual(fib.get_fibonacci_list(1), [0, 1])
        self.assertEqual(fib.get_fibonacci_list(2), [0, 1, 1])
        self.assertEqual(fib.get_fibonacci_list(3), [0, 1, 1, 2])
        self.assertEqual(fib.get_fibonacci_list(4), [0, 1, 1, 2, 5])
        
    # Тест 2, в котором мы пробуем передать отрицательные значения
    def test_get_fibbonaci_negative_vals(self):
        self.assertEqual(fib.get_fibonacci_list(-5), False)
        self.assertEqual(fib.get_fibonacci_list(-10), True)

if __name__ == "__main__":
    unittest.main()


В тесте 1 мы умышленно допустили ошибку, и вот, что получили при запуске теста в консоли:



Исправив тест 1, мы получим сообщение о том, что код работает так, как мы ожидали. В данном случае мы по невнимательности допустили ошибку в тесте. На практике ошибки будут в коде, а тесты будут требовать, чтобы тестируемый участок кода работал так, как от него требуется.

Комментариев нет:

Отправить комментарий