2017-02-04 3 views
1

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

В моей .coveragerc я попробовал:

[report] 
exclude_lines = 
    __* 

Но, кажется, чтобы исключить такие методы, как long_method_name

ли Ther ли способ сделать это без перечисления всех methdos?

EDIT

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

ответ

3

От docs:

class MyObject(object): 
    def __init__(self): 
     blah1() 
     blah2() 

    def __repr__(self): # pragma: no cover 
     return "<MyObject>" 

Исключая все частные методы с одной опции конфигурации не имеет смысла IMO - это приведет к ошибочным предположениям, если один смотрит на результаты покрытия.

+0

Мы в необходимости тестирования только общественности API, а не частные методы, и мы получили как albot 100 или более из них, поэтому запись везде '# pragma' не является вариантом. Нет ли взломать это? – MaLiN2223

+0

Вы можете перепроектировать свои вызовы API, чтобы наследовать что-то разумное в другом файле, поместить частные методы в эти объекты и игнорировать файл, который вы сейчас импортируете. – ti7

1

Ваше регулярное выражение было __*, которое соответствует одному или нескольким символам подчеркивания, поэтому оно исключает любую строку, в которой есть символы подчеркивания. Это не то, что вы хотите.

Это должно работать, чтобы исключить любую функцию определения функции, которая начинается с двойным подчеркиванием:

[report] 
exclude_lines = 
    def __ 

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

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

[report] 
exclude_lines = 
    def __[^(]*[^_][(] 

, но это становится своего рода сумасшедший ...

+0

Это очень близко к запросу, которое я ищу, однако def __ также исключает такие методы, как __add__ или __init__ (я отредактирую свой вопрос, чтобы включить их), которые я бы хотел проверить. Причина для исключения частных методов заключается в том, что у меня есть многие из модулей в графическом интерфейсе (pygame), которые я не хочу модульного теста - для этого я получил тесты GUI. Я получил несколько конфигурационных файлов, и в одном из них мне нужно протестировать только общедоступные методы. – MaLiN2223

+0

[«Я не тестирую частные методы private. Частный метод - это деталь реализации, которая должна быть скрыта для пользователей этого класса. методы разрушают инкапсуляцию. "] (https://stackoverflow.com/a/105021/125507) – endolith

Смежные вопросы