Можно ли сделать отчет о Pytest, если функция никогда не вызывается непосредственно в тесте?

пример

def main(p):
    if foo_a(p):
        return False
    return p**2

def foo_a(p):
    return p % 11 == 0

Теперь вы можете получить 100% тестовое покрытие по

import unittest
from script import main

class Foobar(unittest.TestCase):
    def test_main(self):
        self.assertEquals(main(3), 9)

Но, возможно, один хотел foo_a быть p % 2 == 0 вместо.

Вопрос

Покрытие ветвлений пролило бы свет на это, но я также хотел бы знать, если функция никогда не вызывалась "напрямую" тестом (таким как main в примере), но только косвенно (например, foo_a в примере).

Это возможно с pytest?

1 ответ

Прежде всего, просто общая линия мышления состоит в том, чтобы протестировать foo_a также

import unittest
from script import main, foo_a

class Foobar(unittest.TestCase):
    def test_main(self):
        self.assertEquals(main(3), 9)

    def test_foo_a(self):
        self.assertEquals(foo_a(11), True)

Вы, вероятно, ищете https://coverage.readthedocs.io/en/coverage-4.5.1/ который можно использовать с pytest https://pypi.org/project/pytest-cov/, этот инструмент может показать вам точно какие строки кода были вызваны во время тестирования

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

https://github.com/sixty-north/cosmic-ray

https://github.com/mutpy/mutpy

А также посмотрите на библиотеки тестирования на основе свойств, такие как https://github.com/HypothesisWorks/hypothesis/tree/master/hypothesis-python

Другие вопросы по тегам