Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

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

nosetests
unittest
python
Теги: #<Tag:0x00007f7b70452e58> #<Tag:0x00007f7b70452d18> #<Tag:0x00007f7b70452bd8>

(Carl Garfild) #1

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


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      

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


(Евгений Бухгаммер) #2

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

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

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

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


(Carl Garfild) #3

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

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


(Mykhailo Poliarush) #4

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

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

(Carl Garfild) #5

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


(Carl Garfild) #6

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


(Oleksandr Pylkevych) #7

(Carl Garfild) #8

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

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

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

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


(Mykhailo Poliarush) #9

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

Честно говоря, я не знаю как вы проверяете ваш код, но вот этот не должен выдавать никаких ошибок по 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:\
>

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


(Carl Garfild) #10

import unittest

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

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


(Mykhailo Poliarush) #11

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


(Carl Garfild) #12

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

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

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

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


(Mykhailo Poliarush) #13

Да, надо было написать, что Вы боритесь не с 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:


(Carl Garfild) #14

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


(Mykhailo Poliarush) #15

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


(Carl Garfild) #16

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


class TestCaseBase(unittest.TestCase):

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

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

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


(Carl Garfild) #17

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


(Mykhailo Poliarush) #18

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