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!

★★

Это Питон настолько хорош, что остаётся только придираться по-идиотски, или ТС настолько неадекват?

Deleted
()

тебя заперли в подвале и мучают питоном?

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

эм.

считать пройденным тест при том что в деструкторе выброшен Exception == идиотская придирка?

П

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

считать пройденным тест при том что в деструкторе выброшен Exception == идиотская придирка?

Да. Пройден = закончен.

Deleted
()

pytest не нужен. Пили микросервисы и делай там все свои модульные/интеграционные тесты в одном месте.

crutch_master ★★★★★
()

Вообще не понимаю, зачем ты ковыряешься с ним. Не нравится - сделай свой pytest. Там делать по времени меньше, чем ты на ЛОРе об этом пишешь.

crutch_master ★★★★★
()
Последнее исправление: crutch_master (всего исправлений: 1)

Букварь по Питону до сих пор не читан, как я погляжу.

Во-первых это не деструктор, о чем вы уже знаете, судя по треду о lxml.

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

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

Во-первых это не деструктор

  • плавает как утка (вызывается при удалении)? плавает
  • выглядит как утка (является методом)? выглядит

значит утка деструктор и есть

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

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

в данном треде выделенное красным является офтопиком:

для читающих три абзаца текста с трудом

для начала попробуй прочитать тему треда

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

OMG, для таких как вы информацию картинками, танцами и видео надо передавать? Поделитесь жизненной историей — всегда удвилялся, откуда берутся люди, не могущие осознать написанного.

exceptions that occur during their execution are ignored, and a warning is printed to sys.stderr instead.

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

exceptions that occur during their execution are ignored

  1. зачем нужны исключения, если их игнорировать?
  2. жесть на тему как устроены деструкторы в Python мы обсуждали пару недель назад, в этом треде - эта жесть — офтопик. Обсуждаем систему тестирования.
rsync ★★
() автор топика
Ответ на: комментарий от rsync

плавает как утка (вызывается при удалении)? плавает

представьте что я читаю это вслух, руками изображая процесс:

Called when the instance is about to be destroyed. This is also called a finalizer or (improperly) a destructor.

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

Called when the instance is about to be destroyed

не понимаю что мешало авторам тестовой системы, написавшими столь «замечательный» хак, как «фикстура» решить вопрос с тем, чтобы тесты считались не пройденными, если в результате их вызова приходим к исключению?

rsync ★★
() автор топика

Во-первых, исключение вызвалось вне тест-кейса, а тест-кейс успешно пройден.

Во-вторых, какой нахрен деструктор? __del__() это финализатор и исключение в нём вызвалось уже за пределами тест-кейса.

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

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

это «не понимаю» было риторическим.

видеоуроки тут не нужны. Язык определяет мышление.

я не смогу изменить поломанные мозги Гвидо и его компашки

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

Исключение здесь — не есть результат вызова теста.

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

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

В языках с GC всем похер что там происходит с не нужными объектами. Это же тебе не плюсы, что ты хочешь? Какие деструкторы? Зачем? Зачем их тестить?

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

у нас есть самая замечательная система: если вам что-то от нее - не ждите, а делайте работу сами.

вопрос: а зачем тогда система нужна?

цель тестовой системы в чём? находить проблемы в коде.

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

except: pass

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

pytest тут вообще не причём. они никак не может отловить это исключение даже если бы захотел.

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

исключение вызвалось вне тест-кейса, а тест-кейс успешно пройден.

Это пять. Исключение вызвалось, но тест успешный. Теперь понятно почему питоноскрипты так часто (как никто другой) плюют исключениями юзеру в лицо.

bread
()

Треды всё тупее и тупее, язабан.

doraneko
()
Ответ на: комментарий от rsync
class A:
    def __del__(self):
        raise Exception('test __del__')


def main():
    a = A()
    assert a


if __name__ == '__main__':
    main()

ТЕСТОВАЯ СИСТЕМА ГОВОРИШЬ?

Exception Exception: Exception('test __del__',) in <bound method A.__del__ of <__main__.A instance at 0x7f2a08479638>> ignored
Deleted
()
Ответ на: комментарий от bread

Это пять. Исключение вызвалось, но тест успешный.

gc работает когда хочет, всё нормально. На «деструкторы» тут вообще не стоит полагаться.

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

Ещё один клоун =) Я посмотрю как ты сделаешь свой pytest со всеми теми фичами, что там есть, быстрее чем он создаст очередной тред на лоре.

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

ТС падает на пол и сучит ножками: «мало ли что в документации написано! хочу-хочу-хочу!»

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

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

ваше мнение Очень Важно для нас, оставайтесь пожалуйста на линии!

rsync ★★
() автор топика
Ответ на: комментарий от gistart
  1. деструктор это или не деструктор - это офтопик к обсуждению системы тестирования
  2. плавает как утка/крякает как утка - утка и есть
  3. «хочу чтобы тестовая система помогала находить проблемы» - нормальное желание человека, которому язык не испортил мышление
rsync ★★
() автор топика
Ответ на: комментарий от gistart

Test::More в Perl с данным вопросом справляется.

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

не понимаю [риторическое] почему бы разработчикам, справившимися с написанием хака под названием «фикстура» не справиться с такой мелочью?

а ну да, язык определяет мышление

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

ЧЯДНТ? валится на ok после undef

на перле не писал лет 10, ничего уже не помню

https://perldoc.perl.org/perlobj.html#Destructors
if your DESTROY method throws an error, this error will be ignored. It will not be sent to STDERR and it will not cause the program to die.

libtest.pm

package libtest;
use strict;

sub new {
    my $class = shift;
    return bless {}, $class;
}

sub DESTROY {
    warn 'destroy';
    my $crash = 1 / 0;
}

1;

test.pl

use strict;
use Test::More;
require "./libtest.pm";

ok(1 == 1);

my $t = libtest::new();
ok($t);

undef $t;
ok($t);

output

% perl test.pl
ok 1
ok 2
not ok 3
#   Failed test at test.pl line 11.
# Tests were run but no plan was declared and done_testing() was not seen.
gistart
()
Ответ на: комментарий от rsync

Тебе тысячу раз сказали, еще в прошлых тредах, что это не деструктор. Зачем тебе вообще del пользоваться и тем более бросать там исключения? Есть contextmanager`ы.

Плохой наброс, прошлые треды лучше были. Попробуй что-нибудь отсюда взять для следующего треда https://github.com/cosmologicon/pywat

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

как никто другой) плюют исключениями юзеру в лицо.

Одно из преимуществ пайтона.

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

я подозревал, что у rsync что-то не то со способностью усваивать информацию, но чтобы вот *так*.... мегажесть :))))

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

не обижай ТСа! я прям поражаюсь с каким упорством он жрет этот кактус и регулярно таскает сюда самые вкусные моменты. любой другой на его месте давно бы уже сдался или научился делать правильно, скатив лор в унылоту.

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

он жрет этот кактус

Нее, ТС настолько гений, что перепутал дырки, и суёт кактус куда-то не туда. Суёт и воет, воет и суёт. Такой затейник.

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