t.me/atinfo_chat Telegram группа по автоматизации тестирования

Настройка вывода информации AUTOMATION TESTS c библиотекой nosetests

Теги: #<Tag:0x00007f748c500cf0> #<Tag:0x00007f748c500b38> #<Tag:0x00007f748c5008e0>

Привет, и сразу заранее спасибо за помощь.


import unittest

class MyTestCase(unittest.TestCase):
    def test_with_docstring(self):
        """Test that something does something \
            i can fly

        """

    def test_without_docstring(self):
        pass

if __name__ == '__main__':
    nose.run(argv=["nosetests" "***.py", "--verbosity=2"])
>>>Validation of ******        i can fly      
>>>test_without_docstring (tmp.MyTestCase)

Как избавится от пробелов? (в одну строку писать нельзя т.к. PEP 8)

Такое решение не подходит:


import unittest

class MyTestCase(unittest.TestCase):
    def test_with_docstring(self):
        """Test that something does something \
i can fly

        """

    def test_without_docstring(self):
        pass

if __name__ == '__main__':
    nose.run(argv=["nosetests" "***.py", "--verbosity=2"])
>>>Validation of ****** i can fly      

Или как вариант избавится от “”

Вы свой код запускали?)))

  1. PEP8 хорош, но это не must have. Сейчас у 8\10 есть вайдскрин мониторы, и конкретно конвенция по 79 символам - очень спорная.

  2. Символ разрыва строки у вас - должен быть для разбиеня кода? В этом случае нужно закрыть string кавычками, чтобы символ разрыва строки не расценивался как подстрока.

  3. Вы импортируете nose, но не используете?

поправил код чтоб было понятней, делал в спешке, сейчас проверил что работает.

Без валидации PEP8 нельзя сделать SUBMIT ( у нас)

Строки можно еще записывать через ( )

import unittest
class MyTestCase(unittest.TestCase):
    def test_with_docstring(self):
        ('Test that something does'
         ' something i can fly')
        pass

Statement seems to have no effect less… (Ctrl+F1)
This inspection detects statements without any effect

Не знаю почему PEP8 сразу не показал тогда в коде, но
PEP8: continuation line under-indented for visual indent

1 Симпатия

Забраковали такой вариант, система не пропускает(

Сейчас в проекте так:

Должно быть как то так:

Но при этом вывод инфы с кучей пробелов:

Ну это я указал, как можно задавать строку в другом формате.

Честно говоря, я не знаю как вы проверяете ваш код, но вот этот не должен выдавать никаких ошибок по pep8

import unittest


class MyTestCase(unittest.TestCase):
    def test_with_docstring(self):
        """Test that something does something i can fly"""
        pass


class MyTestCase1(unittest.TestCase):
    def test_with_docstring(self):
        """
        Really big test documentation with
        some description and some of big text
        and some description and some of big text
        some description and some of big text
        some description and some of big text
        """
        pass


class MyTestCase2(unittest.TestCase):
    def test_with_docstring(self):
        """
Really big test documentation with
some description and some of big text
and some description and some of big text
some description and some of big text
some description and some of big text
        """
        pass

Вот специально для вас запустил через pep8 https://github.com/jcrocholl/pep8

>pep8 --statistics demo.py

c:\
>

Так что пожалуйста покажите, что вас в этом коде не устраивает.

import unittest

class MyTestCase(unittest.TestCase):
def test_with_docstring(self):
“”“Test that something does something i can fly”""
pass
Устраивает это - но только пока не нужно вставить 150 символов

Выше я показал в скриншотах проблему.

Я проапдейтил пример выше

Вот что выводит Ваш пример

Для его работы не хватает \ в конце каждой строки

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

Прошу прощения - если изначально неправильно изьяснил задачу

Да, надо было написать, что Вы боритесь не с PEP8, а с правильным выводом в консоль через nosetests.

В общем, простым способом, получить то что Вы хотите не получиться, потому что такое вот поведение Multi-line Docstrings можете почитать здесь https://www.python.org/dev/peps/pep-0257/

Но проблема все таки решаема. Я частично затрагивал эту тему в своем уроке по ООП http://lessons2.ru/lesson/preview/klassy-i-oop-v-python/

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

import unittest


def fix_doc_strings(cls):
    for name, method in cls.__dict__.iteritems():
        if callable(method):
            doc_str = " ".join(map(str.strip, method.__doc__.splitlines()))
            method.__doc__ = doc_str
    return cls


@fix_doc_strings
class MyTestCase2(unittest.TestCase):
    def test_with_docstring(self):
        """
        with fix: Really big test documentation with
        some description
        and big text
        and extra words
        """
        pass


class MyTestCase3(unittest.TestCase):
    def test_with_docstring(self):
        """
        Without fix: Really big test documentation with
        some description and some of big text
        and some extra words
        """
        pass

и вывод получается вот таким

>nosetests -v demo.py
with fix: Really big test documentation with some description and big text and extra words ... ok
Without fix: Really big test documentation with ... ok

----------------------------------------------------------------------
Ran 2 tests in 0.002s

OK

Я так понимаю это то что Вам надо было. Декоратор @fix_doc_strings нужно прописывать для каждого класса в модуле как видно. Но и это можно обойти через использование метаклассов на уровне модуля. Но это уже другая история :smile:

4 Симпатий

БОЛЬШОЕ СПАСИБО!
Вот этот вариант буду и развивать!

Ну я рад! Не забываем ставить лайки, если сообщение нравиться

1 Симпатия

Решил пойти дальше. Не хочу я враперы на каждом классе.


class TestCaseBase(unittest.TestCase):

    def shortDescription(self):
        doc = self._testMethodDoc
        return " ".join(map(str.strip, doc.splitlines()))

а все другие классы наследуются от TestCaseBase

И больше не нужно враперов, может кому то поможет.

3 Симпатий

у меня возник вопрос - а какое решение Вы предложили? можно пример для саморазвития)

Ну для того чтобы не присваивать декоратор для каждого тестового класса в модуле, можно сделать метакласс на уровне модуля и который будет влиять на формирование тестовых классов в модуле. В интернете много информации по поводу метаклассов, посмотрите, почитайте, а будут конкретные вопросы, напишите. А если надо будет что-то хитромудрое решение сделать, то обращайтесь сюда http://lessons2.ru/consulting/