Найти - Пользователи
Полная версия: Покажите TDD на моём примере
Начало » Python для новичков » Покажите TDD на моём примере
1
NotDeadAlready
Нужно создать класс, который инициализируется списком целых чисел и на их основе вычисляет список вещественных чисел. У класса должен быть единственный метод-геттер, который выдаёт требуемый элемент списка вещественных чисел. При выходе за пределы списка должна замигать красная лампочка и завыть сирена. В смысле, программа должна прерваться и предупредить. :o

values = [ 10, 20, 5, 31 ]
total = sum(values)
equities = []
for n in values:
    equities.append(n/total)
while 1:
    number = int(input("Enter number: "))
    if 0 <= number < len(equities):
        print (equities[number])
    else:
        print ("It devil knows")
        break

Я пока что научился только вот так быдлокодить. А хотелось бы с классами и ТДД, как у взрослых. ;)
fata1ex
Думаю, для начала нужно нормально изучить язык, а потом уже применять какие-то методологии.

NotDeadAlready
У класса должен быть единственный метод-геттер, который выдаёт требуемый элемент списка вещественных чисел. При выходе за пределы списка должна замигать красная лампочка и завыть сирена.
В чем отличия от стандартного list'a?

>>> class MyList(list):
...     def __init__(self, *args):
...         total = float(sum(args))
...         super(MyList, self).__init__([arg / total for arg in args])
...         
...     
... 
>>> obj = MyList(1, 2, 3, 4, 5)
>>> obj
[0.06666666666666667, 0.13333333333333333, 0.2, 0.26666666666666666, 0.333333333
3333333]
>>> obj[1]
0.13333333333333333
>>> obj[5]
Traceback (most recent call last):
  File "<input>", line 1, in <module>
IndexError: list index out of range
NotDeadAlready
fata1ex
Думаю, для начала нужно нормально изучить язык, а потом уже применять какие-то методологии.

Не знаю, что в Вашем понимании “нормально”. Скорее всего, мне никогда не понадобится знать Пайтон на Вашем уровне. Я не профессиональный программист и уже не стремлюсь им быть. Да, я быдлокодер. И вряд ли смогу это изменить - я уже слишком стар и глуп. А главное - у меня нет никакой мотивации. Деньги я зарабатываю другим способом. Мне просто надо делать всякие утилитки для личных нужд.

В чем отличия от стандартного list'a?

А должны быть отличия? Это же “сферический конь в вакууме”, на примере которого я хочу понять логику применения ТДД. А то, что на первом этапе не нужны никакие методики - вопрос спорный. Есть мнение, что лучше сразу всё делать правильно (или хотя бы пытаться), чтоб потом не переучиваться.
fata1ex
NotDeadAlready
Мне просто надо делать всякие утилитки для личных нужд.
NotDeadAlready
я хочу понять логику применения ТДД
Интересный подход у вас :)

При тестировании определяющую роль играет набор требований, по которому строятся непосредственно тесты. Банально, да, но из требований я заметил только наличие геттера и контроль выхода за пределы списка. Вы хотите увидеть однострочные тесты к стандартному типу? assertTrue(hasattr(obj, ‘__getitem__’)), assertRaises(…)?

В общем, по-моему, опробовать новый подход можно только самостоятельно его испытав на, например, “утилитке для личной нужды”. Составляете требования, пишете тесты, пишете код, прогоняете тесты, и по кругу.

Может, кто-нибудь другой вам подскажет лучше.
GaiveR
Лично мне понравилось описание TDD в книжке “Dive into python3”, раздел “Unit Testing”. Посмотрите, возможно, там вы найдете ответы на свои вопросы.
NotDeadAlready
fata1ex
NotDeadAlready
Мне просто надо делать всякие утилитки для личных нужд.
NotDeadAlready
я хочу понять логику применения ТДД
Интересный подход у вас

Возможно. Однако некоторые мои утилитки достаточно объёмны, чтобы испытывать нужду в ТДД.

При тестировании определяющую роль играет набор требований, по которому строятся непосредственно тесты. Банально, да, но из требований я заметил только наличие геттера и контроль выхода за пределы списка.

Главное требование - чтобы результаты расчётов совпадали с теми, что были получены на бумаге. Хотя бы на парочке наборов входных данных. А зачем проверять наличие геттера, если мы так и так будем его вызывать? Контроль выхода за пределы списка тоже не так уж важен для меня, потому что данные будут подготавливаться другой программой, а не руками. Соответственно, та программа тоже будет оттестирована, чтобы быть уверенным, что она выдаёт корректный набор входных данных.

Вы хотите увидеть однострочные тесты к стандартному типу? assertTrue(hasattr(obj, ‘__getitem__’)), assertRaises(…)?

Я хочу увидеть весь процесс создания нужного мне класса по шагам, начиная с написания означенных Вами тестов, пусть и однострочных. Для понимания методики это не имеет значения.

В общем, по-моему, опробовать новый подход можно только самостоятельно его испытав на, например, “утилитке для личной нужды”.

Именно это я и пытался сделать. Вы не поверите, но этот примитивный класс - фундаментальных в моей проге. От него будет отпочкован по крайней мере ещё один, уже гораздо более интересный.

Составляете требования, пишете тесты, пишете код, прогоняете тесты, и по кругу.

Требования я составил. Код какой-никакой, но написал. Вот видите, у меня не получилось применить ТДД. Плоховато я представляю весь процесс. Допустим, я напишу тесты (пусть и постфактум). Как потом их запускать? Делать в файле проверку __init__ == __main__? Тогда можно будет в любой момент проверить корректность класса, просто запустив соответствующий файл .py. А как потом проверять всю прогу? Написать примитивный скрипт, который запускает все .py в каталоге, направляет их вывод в файл, а потом ищет в файле все строчки, в которых есть слово FAILED?

Может, кто-нибудь другой вам подскажет лучше.

Мне не подсказки нужны, а полное решение. Я так понимаю лучше - на конкретных примерах. Поэтому и выбрал такой примитивный пример, что дальше некуда. Иначе получилась бы полноценная программа, а Вы вряд ли будете писать за меня, да ещё оформлять тестами, и всё это за бесплатно?
NotDeadAlready
GaiveR
Лично мне понравилось описание TDD в книжке “Dive into python3”, раздел “Unit Testing”. Посмотрите, возможно, там вы найдете ответы на свои вопросы.

Нашёл эту книгу, а пока искал, наткнулся ещё и на такую: “Python Testing Beginner's Guide”. Судя по названию и объёму (255 страниц) это как раз то, что мне нужно! Спасибо, что дали наводку.
NotDeadAlready
fata1ex
>>> class MyList(list):
...     def __init__(self, *args):
...         total = float(sum(args))
...         super(MyList, self).__init__([arg / total for arg in args])

Много думал. Действительно, очень похоже на то, что мне нужно. Только не MyList, а Vector (мне нужно имитировать одномерный массив стандартными средствами). Но я пока что не умею так писать, а следовательно - и читать такой код достаточно свободно. Умел бы - ушёл бы на F# вообще (в принципе, он лучше вписывается в моё рабочее окружение). В любом случае - большое спасибо. Воспользуюсь!
fata1ex
NotDeadAlready, ну вот видите, вам для начала нужно познакомиться с тестированием в питоне. И тогда не будет возникать вопросов, как запускать тесты и тд. Именно поэтому первая фраза была насчет изучения языка.

Соответственно, та программа тоже будет оттестирована, чтобы быть уверенным, что она выдаёт корректный набор входных данных.
А если вы захотите через полгода взять эту часть программы и использовать в другом месте, то может оказаться, что у вас что-то не работает, и вы уже не вспомните, что это потому что вы не сделали тесты, уповая на надежность внешнего источника данных :)

NotDeadAlready
Я хочу увидеть весь процесс создания нужного мне класса по шагам
ТДД не отличается в плане написания кода ничем. Просто для начала вы пишете тесты, а потом их прогоняете.

NotDeadAlready
Вот видите, у меня не получилось применить ТДД. Плоховато я представляю весь процесс. Допустим, я напишу тесты (пусть и постфактум). Как потом их запускать? Делать в файле проверку __init__ == __main__? Тогда можно будет в любой момент проверить корректность класса, просто запустив соответствующий файл .py. А как потом проверять всю прогу? Написать примитивный скрипт, который запускает все .py в каталоге, направляет их вывод в файл, а потом ищет в файле все строчки, в которых есть слово FAILED?

Я не вижу тут вопросов по методу разработки. У вас возникают проблемы с написанием тестов. Книжку выбрали нормальную, представление о тестировании она должна дать.


This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB