Форум сайта python.su
0
Добрый день!
Подскажите пожалуйста, как возвращать значение выполненной функции. Т.е я хочу написать три функции численного интегрирования, а затем запустить функцию тестирования, чтобы она запускала тестируемые функции. Но у меня выходит ошибка. Тест получается если я каждую тестируемую функцию вношу отдельно, а именно:
- такой способ не работает
def test_method(method): '''разбивает интегрируемую функцию на части "n" до получения заданной точности''' print("Тестируем ", method.__doc__) a=0 b=3 n=1 y1=method n*=2 y2=method print(y2) while abs(y2-y1)>0.001: n*=2 y1=method n*=2 y2=method print("конечное колличество разбиений:", n) print("значение функции:", y2) if __name__=="__main__": test_method(rectangle_method)
while abs(y2-y1)>0.001: TypeError: unsupported operand type(s) for -: 'function' and 'function'
def test_method(method): '''разбивает интегрируемую функцию на части "n" до получения заданной точности''' print("Тестируем ", method.__doc__) a=0 b=3 n=1 y1=rectangle_method(f, n, a, b) n*=2 y2=rectangle_method(f, n, a, b) print(y2) while abs(y2-y1)>0.001: n*=2 y1=rectangle_method(f, n, a, b) n*=2 y2=rectangle_method(f, n, a, b) print("конечное колличество разбиений:", n) print("значение функции:", y2)
def rectangle_method(f, n, a, b): '''интегрирование методом прямоугольников''' h=(b-a)/n y=h*sum([f(a+k*h) for k in range(n+1)]) return float(y)
Офлайн
857
Не надо ничего передавать в тестирующую функцию. Внутри функции определи набор (f, n, a, b) и res - правильный ответ для этого набора. Дальше вызови функцию rectangle_method() с этим набором (f, n, a, b), получи ответ для него и сравни с правильным ответом res через assert. Если ответы не сойдутся, тест выпадет и покажет, что функция rectangle_method() для набора (f, n, a, b) работает неправильно. Если ответы сойдутся, то тест пройдёт и покажет, что функция rectangle_method() для набора (f, n, a, b) работает правильно.
Используй пакет py.test или модуль unittest.
Иногда можно использовать модуль doctest, чтобы по-быстрому тесты делать. Вообще, doctest подразумевает, что ты прямо в комментарии функции пишешь тесты, но можно и отдельные файлы писать и подавать их в doctest через командную строку (чтобы не засорять комментарии функций тестовыми данными).
Пример использования doctest без засорения кода:
file_with_tests.txt
>>> from module_name import function_name as f
>>> f(1, 2, 3, 4)
5
>>> f(2, 3, 4, 5)
6
>>>
python3 -mdoctest file_with_tests.txt
Отредактировано py.user.next (Ноя. 4, 2018 14:58:03)
Офлайн