LINUX.ORG.RU
ФорумTalks

Прекрасная система тестирования в Python

 , ,


0

2
class Foo():
    def __init__(self):
        print('конструктор')

    def __del__(self):
        print('деструктор')
        raise ValueError('плохой деструктор')


def test_foo():
    f = Foo()
    assert f, 'Инстанцирован'

И собственно работа:

$ pytest -sv test_e.py
=========================== test session starts ============================
platform linux -- Python 3.6.7, pytest-3.7.2, py-1.7.0, pluggy-0.8.1 -- /usr/bin/python3
cachedir: .pytest_cache
rootdir: /home/unera, inifile:
plugins: teamcity-messages-1.21, aiohttp-0.3.0
collected 1 item                                                           

test_e.py::test_foo конструктор
деструктор
Exception ignored in: <bound method Foo.__del__ of <test_e.Foo object at 0x7f5d99c2c198>>
Traceback (most recent call last):
  File "/home/unera/test_e.py", line 7, in __del__
    raise ValueError('плохой деструктор')
ValueError: плохой деструктор
PASSED

========================= 1 passed in 0.03 seconds =========================

Прямо даже уже и не знаю чо сказать. И правда, подумаешь - ну исключение какое-то. Не считать же тестирование неуспешным при этом, правда?

passed, Карл, passed!

★★

Ответ на: комментарий от rsync

Покажите наконец пример, как это работает в Перле.

Пока-что из перлдоки я вижу, что деструкторы там ведут себя так же, как и в Питоне — проглатывают исключения. В отличие от Питона, они делают это молча, Питон хотя бы в stderr пишет.

gistart
()
Ответ на: комментарий от rsync

из твоей ссылки же текст.

Смотрю я на твои сообщения и грустно становится. Неужели нас всех такое угасание деятельности мозга ждёт? Вместо того, чтобы прочитать текст и попытаться его понять, ты увидел одно слово и цепляешься за него. «Смотрите, я увидел слово destructor!» Какой же он деструктор, если его вызов не гарантируется?

i-rinat ★★★★★
()
Ответ на: комментарий от rsync

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

i-rinat ★★★★★
()
Ответ на: комментарий от bread

Это не он отчитался, а питон, алё

Deleted
()
Ответ на: комментарий от rsync

как-то меня убеждали человек 30 в одном треде о деструкторах - они вызываются на выходе из скоупа

Вот даже не важно когда это вызывается. Вызывается оно вне рамок теста.

чеб не похачить еще?

Я тебе и говорю что хакнуть можно, только для этого нужно знать что хакать.

WitcherGeralt ★★
()
Ответ на: комментарий от i-rinat

ты увидел одно слово и цепляешься за него. «Смотрите, я увидел слово destructor!»

погоди, это же я ваши крики комментировал «это не деструктор!»

при том что данный тред к деструкторам имеет весьма опосредованное отношение

rsync ★★
() автор топика
Ответ на: комментарий от i-rinat

как всё должно выглядеть, в деталях

pytest выводит лог пройденных тестов. Чтоб ему не считать тест пройденным, если нашелся Exception?

куда уж детальнее?

rsync ★★
() автор топика
Ответ на: комментарий от templarrr

нет, Тузег - это самостоятельный персонаж, который так же удовлетворял тайные желания Шамана007 к модерации

rsync ★★
() автор топика
Ответ на: комментарий от WitcherGeralt

Вот даже не важно когда это вызывается. Вызывается оно вне рамок теста

нужно выбрать. Или на выходе из скоупа — в рамках текста или не важно когда

rsync ★★
() автор топика
Ответ на: комментарий от Deleted

Всё сильно проще, даже грязные хаки не требуются. Нужно зание за чем следить, чутка метапрограммирования, коллбек, вызов gc.collect() в конце теста и проверка результатов с коллбека. Думаю, что идея ясна.

WitcherGeralt ★★
()
Ответ на: комментарий от WitcherGeralt

Всё сильно проще, даже грязные хаки не требуются

в питоне традиционно делают только грязными хаками.

например объект Exception не содержит ссылки на стек. чтоб достать стек - надо грязно просить у системы контекст (где есть тот же Exception)

фикстуры какими хаками делаются - так вообще за гранью. Это ж надо догадаться: по именам атрибутов функции формировать для нее аргументы. ППЦ.

так что и этот вопрос если бы решали (если бы действительно занимались тестами) то решили бы именно так - грязным (как обычно) хаком

rsync ★★
() автор топика
Последнее исправление: rsync (всего исправлений: 1)
Ответ на: комментарий от rsync

Допустим ты прав. Дальше что? Ты перестанешь писать на питоне, или тебе все же придется грызть кактус? Зачем эта клоунада на 1000500 тредов?

ggrn ★★★★★
()
Ответ на: комментарий от rsync

погоди, это же я ваши крики комментировал «это не деструктор!»

Ты так и не понял разницы между деструктором и финализатором.

при том что данный тред к деструкторам имеет весьма опосредованное отношение

Прямое. Просто ты не осилил прочитать документацию. И гордишься этим.

i-rinat ★★★★★
()
Ответ на: комментарий от Shaman007

На тот момент ему было 35 лет и у него было трое детей. По телефону он разговаривал как совсем неадекватный.

Таки вычислили по айпи? :D

Manhunt ★★★★★
()
Ответ на: комментарий от rsync

pytest выводит лог пройденных тестов. Чтоб ему не считать тест пройденным, если нашелся Exception?

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

куда уж детальнее?

Пока твоего описания недостаточно для реализации интерпретатора языка, это не достаточно детальное описание.

i-rinat ★★★★★
()
Ответ на: комментарий от ggrn

Дальше что?

Отрицание, гнев, торг, депрессия, принятие.

Дальше, видимо, торг.

i-rinat ★★★★★
()
Ответ на: комментарий от gistart

Ты прав, я это знаю, ты это знаешь, @rsync это знает, но вот так вот он устроен. Выскавляет себя глухим и тупым, ты ведешься, ему радость. Не ведись.

t184256 ★★★★★
()
Ответ на: комментарий от Shaman007

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

grem ★★★★★
()
Ответ на: комментарий от t184256

Да мне сегодня особо делать нечего, почему бы и не поглумиться?

gistart
()
Ответ на: комментарий от rsync

Так и пишут всю тему, что ты пытаешься отловить исключение, которого нет. А раз его нет, то и тест будет passed. И всю тему пишут, что это не классический деструктор, а финализатор, который позволит, условно говоря, «привести дела в порядок», перед тем, как объект за ненадобностью удалит GC.

Объекты в python удаляет GC. Тебе понравиться, когда в середине скрипта, где-то в странном месте у тебя вылетит exception и всё обвалится, потому что GC решил убрать объект, у которого ref counter обнулился?

SkyMaverick ★★★★★
()
Последнее исправление: SkyMaverick (всего исправлений: 1)
Ответ на: комментарий от gistart

Ну да, насколько я (не)помню Perl, там такой же GC и подсчёт ссылок.

Меня больше убивает упорное нежелание читать доку, а если прочитать, то трактовать не так, как в ней написано, а так как хочется. Какой-то своеобразный подход.

SkyMaverick ★★★★★
()

Перескакивай на С++ - вон, скока тут тем последнюю неделю по плюсам!

А я почитаю...

pacify ★★★★★
()
Ответ на: комментарий от rsync

Это не деструктор, а специальный метод, вызываемый перед вызовом деструктора. Да, он вызывается при удалении. Но не последним.

olegd ★★★
()
Ответ на: комментарий от templarrr

Судя по намёкам — Унера. У них с Шаманом был конфликт с угрозами членовредительства (возможно, с обеих сторон) на почве кривого оформления новостей и обидных формулировок причин удаления и бана.

olegd ★★★
()
Последнее исправление: olegd (всего исправлений: 1)
Ответ на: комментарий от olegd

rootdir: /home/unera

Да уж, тонкие намеки. Один из древнейших анонимусов ЛОРа насколько я понимаю. А вы его тут шпыняете, сопляки :)

bread
()
Ответ на: комментарий от i-rinat

Это можно считать проблемой языка.

Ну это и так понятно, я думал там все же есть какие-то средства показать, что случилась страшная фигня и тесты нельзя защитывать. Но нет, так нет. Очередная тупая фича: типа финализаторы (которые лучше не трогать), но называются в доках деструкторами, как это питонично.

bread
()
Ответ на: комментарий от bread

типа финализаторы (которые лучше не трогать), но называются в доках деструкторами, как это питонично.

https://docs.python.org/3/reference/datamodel.html#object.__del__

This is also called a finalizer or (improperly) a destructor.

Мда. А вы с ТС'ом поладите.

i-rinat ★★★★★
()
Ответ на: Починил от theNamelessOne

Как отловить Exception, который отлавливается рантаймом питона и им же игнорируется?

как напечатать стек ошибки при том что в ошибке нет стека? воспользоваться хак-функцией, которая достанет из неизвестно откуда и стек и ошибку заноГо

rsync ★★
() автор топика
Ответ на: комментарий от SkyMaverick

Так и пишут всю тему, что ты пытаешься отловить исключение, которого нет.

как это нет? очень даже есть!

rsync ★★
() автор топика
Ответ на: комментарий от SkyMaverick

Тебе понравиться, когда в середине скрипта, где-то в странном месте у тебя вылетит exception и всё обвалится, потому что GC решил убрать объект, у которого ref counter обнулился?

мне понравится если:

  • ексепшен поможет отловить тестовая система
  • и юзер его не увидит

а в остальном - питон вообще единственный язык где принято показывать стектрейсы пользователям

rsync ★★
() автор топика
Ответ на: комментарий от olegd

история была совсем другой: шаман получил модераторские нашивки и приставал ко всем «я очень хочу понажимать кнопочку»

тогда ~15 человек сжалилось над ним и такую возможность ему предоставили

ну а у меня на работе просто все ржали когда позвонил какой-то чЮдик и сказал «здравствуйте, я седьмой шаман. я хотел сказать что я наигрался»

ржал весь институт, что он теперь записывает себе в победы :)

rsync ★★
() автор топика
Ответ на: комментарий от rsync

Для тест-фреймворка нет, потому что финализатор съедает исключения. И не съедать его чревато фатальными проблемами с GC.

Сколько уже можно тупить?

SkyMaverick ★★★★★
()
Ответ на: комментарий от i-rinat

У тебя просто другой питон, в моих доках пишут: This is also called a destructor. Наверно раньше это были деструкторы, а потом поменяли семантику, да? Если слепо следовать словам, то так получается.

bread
()
Ответ на: комментарий от rsync

мне понравится если: ексепшен поможет отловить тестовая система

Это невозможно. ТОЧКА. Над GC можно, конечно, извращаться (и выше писали как), но мазохизм - это сугубо по желанию.

и юзер его не увидит

Это врядли

SkyMaverick ★★★★★
()
Ответ на: комментарий от i-rinat

Или просто питоноделы не знали что есть деструктор когда лепили эту __del__. Трудно поверить, но мало ли. Учитывая сколько в питоне фейспалмов, может так и было.

bread
()
Ответ на: комментарий от bread

Оно не разрушает объект, что должен делать классический деструктор. Оно даёт выполнить действия перед разрушением объекта. Разрушает объект, т.е. выполняет собственно роль дестуктора, garbage collector (GC). ПЕРЕД тем как удалить объект (на него нет ссылок) он запускает этот несчастный __del__.

в моих доках пишут

А в нормальных там написано слово improperly https://docs.python.org/3/reference/datamodel.html#object.__del__

SkyMaverick ★★★★★
()
Ответ на: комментарий от bread

У тебя просто другой питон, в моих доках пишут: This is also called a destructor.

Как я и говорил, вы с ТС'ом поладите. Оба видите то, что хотите увидеть, игнорируя всё остальное.

Наверно раньше это были деструкторы, а потом поменяли семантику, да?

Не знаю, как было раньше, но сейчас Python — язык со сборкой мусора. Там нет и не может быть деструкторов в том виде, как они есть в C++, например. __del__ можно называть деструктором, но только если в понятие «деструктор» ты вкладываешь ровно то, что написано в доках.

Идея, в общем-то, простая, если подумать. Но это ж думать надо.

i-rinat ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.