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!

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

Иногда у объекта может быть кеш где-нибудь на диске, например, или нужно вызвать деконструктор какой-то сущности из сишной библиотеки, я не раз сталкивался.

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

В тесте ничего под эксепт-пасс не сунули, тест вообще про вызов финализатора не знает, и это в принципе за рамками кейса даже логически. Вызови его сам. Проблема-то в чём?

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

Я посмотрю как ты сделаешь свой pytest со всеми теми фичами,

Зачем ему сразу все «те» фичи? Ему надо просто запустить тест, чтобы он свалился с исключением. Я думаю ТС вполне справится с этим.

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

Ну это всё понятно там, соединения еще закрыть корректно, транзакции откатить и т.п., но ТСу это зачем? Он кода такого уровня явно не пишет.

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

Проблема-то в чём?

pytest ДОЛЖЕН это был сделать за него, вот в чём.

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

С соединениями у нас в Джанго такое было. Народ открывал их тупо в модуле и юзал. Но не закрывал, на что рабит жаловался и это занимало гигабайты логов...

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

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

Зачем тебе вообще del пользоваться

del не вызывает __del__, его вызывает gc, а исключением он просто продемонстрировал поведение при возможном косяке в коде финализатора.

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

в деструкторе выброшен Exception

Это не деструктор. Ты хотя бы тьюториал языка читал, перед тем, как кодить? Выглядишь идиотом.

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

Это не деструктор, но исключение в нем приводит к лулзам. Так что какая разница что это в контексте треда?

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

ТС неадекват чуть менее чем весь.

Ага, зато фанбои, которые в надцатый раз подрываются на темах ТС, верх адекватности.

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

ТС 10 лет назад засирал ЛОР скриптом из-за того, что ему что-то показалось и благодаря этому тут введена капча и баны по IP. На тот момент ему было 35 лет и у него было трое детей. По телефону он разговаривал как совсем неадекватный.

И да, я буду помнить это всегда.

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

но исключение в нем приводит к лулзам

Хм. Где лулзы-то?. Я на питоне не часто пишу, но когда-то читал доки, и там, кстати, написано, что происходит и почему: https://docs.python.org/2/reference/datamodel.html#object.__del__.

Так что какая разница что это в контексте треда?

ТС не прочитал базовых вещей про язык, которым пытается пользоваться. У него подгорает из-за того, что Python не является Perl. Это уже даже не смешно, это просто глупо. Я таких «почему они не могли сделать нормально?» уже достаточно много видел. И всегда они сдувались на встречном вопросе: «А как бы сделал ты и почему?»

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

Все уже давно поняли, что твой мозг безнадежно поражен перлом, можешь перестать нам это доказывать. Единственное что я не могу понять: как тебя такого пропустили в DD? Куда смотрел твой ментор?

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

ЧЯДНТ?

  • используешь какую-то древнючую объектную систему
  • тест у тебя не прошел
  • require "./libtest.pm";
    

    питонизмы в моём Perl

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

Тебе тысячу раз сказали, еще в прошлых тредах, что это не деструктор

разве в этом треде обсуждают деструкторы это или нет?

в этом треде обсуждают тестовую систему

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

тест вообще про вызов финализатора не знает

а в чем проблема - поймать ексепшен и пометить весь файл теста как не пройденный?

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

Хм. Где лулзы-то?

Тестовый фреймворк проигнорировал исключение и отчитался: все нормально, шеф. Это весьма самобытный подход к тестированию.

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

Ему надо просто запустить тест, чтобы он свалился с исключением

тест, свалившийся с исключением == бага

у теста, как и у произвольной программы должен быть один режим работы: корректно работает.

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

соответственно когда тест валится с исключением == то же самое что и когда валится с исключением видеопроигрыватель.

всё что можно сказать о таком тесте - плохой тест

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

Это не деструктор

это деструктор. обсуждено выше.

  • выглядит как утка
  • крякает как утка
  • утка и есть

а то что тебе не нравится называть это деструктором - реальности не поменяет

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

И да, я буду помнить это всегда.

это правильно.

для тебя же всё и делалось, чтобы ты помнил

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

ТС 10 лет назад засирал ЛОР ... На тот момент ему было 35 лет

Подтверждение, что ТС опытный девелопер. А говорили школьник, нуб.

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

Чтобы что помнил? Что ты неадекватен и твое мнение по любому вопросу примерно так же важно, как чириканье воробья? Да, это я помню.

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

ТС не прочитал базовых вещей про язык, которым пытается пользоваться

object.__del__(self)

Called when the instance is about to be destroyed. This is also called a destructor.

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

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

Как ты себе представляешь поимку исключения из кода, вызываемого вне рамок теста, внутри теста?

Код ты должен вызвать сам внутри теста, это абсолютно логично. Либо нужно как-то обозначить классы, за уничтожением объектов которых надо следить, но первый вариант банально прозрачней.

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

Красный warning (конкретено первое предложение в нём) там по ссылке для кого писано?

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

Как ты себе представляешь поимку исключения из кода, вызываемого вне рамок теста, внутри теста?

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

вот смотри: модифицируем немного тест (допишем секцию):

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

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


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


def test_bar():
    pass

Результат:

$ 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 -- /home/unera/work/ya/venv/bin/python3.6
cachedir: .pytest_cache
rootdir: /home/unera, inifile:
plugins: teamcity-messages-1.21, xdist-1.25.0, timeout-1.3.3, forked-1.0.1, aiohttp-0.3.0
collected 2 items                                                                                                 

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

видим, что следующий тест вполне себе прошел.

Python же - язык __грязных__.__хаков__. Вон хоть посмотреть на фикстуры.

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

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

Шаман, загляни в некорректные, там в комментах адок нацистский

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

Ты по телефону 2 слова связать не можешь

сам легенду рассказал сам в нее поверил :) продолжай

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

Я вот не пойму: ты шланг или дурак?

тебе цитату из документации привели, что это деструкторы.

мало?

object.__del__(self)

Called when the instance is about to be destroyed. This is also called a destructor.

Еще хочешь поговорить о том что деструктор это или нет?

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

тест у тебя не прошел

Ох лол, не прошел тест на проверку только что undef'нутой переменной. Как задетектить ошибку в деструкторе?

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

тебе цитату из документации привели, что это деструкторы.

И там же в варнинге написано, что exception-ы оттуда не вызываются. LOL.

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

И там же в варнинге написано, что exception-ы оттуда не вызываются

блин, мы это и обсуждаем.

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

ухты сколько новой информации

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

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

Он его в принципе не может поймать. В питоне нельзя оттуда поймать исключение. Думаю, это общая проблема/свойство языков со сборкой мусора и финализаторами. Где в программе ловить такие исключения?

Это можно считать проблемой языка. Но считать это проблемой тестового фреймворка эквивалентно росписи в собственной некомпетентности. ТС'у уже несколько раз объясняли, но он упоротый и не хочет вообще думать. Он хочет, чтобы было так, как он сказал. Вон, в сообщениях выше он увидел слово destructor, и теперь считает, что раз слово знакомое, то и поведение обязано быть знакомым.

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

В питоне нельзя оттуда поймать исключение

в питоне из объекта Exception нельзя достать строку и файл места, где оно произошло. Нет так же стека.

поэтому сами питоно-разработчики взяли и похачили это дело добавив sys.exc_info()

что тут помешало?

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

ЯННП петон сам игнорит исключение, как ты его ловить собрался? в __del__ ты его только отловить и можешь сам. ну или при явном вызове __del__(). pytest тебе никак туда не залезет. нет, конечно в теории можно покопаться, но это не нужно просто.

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