[python] coverage.py (how to 100% ?)
Переносим "import myfile" в main на следующую строчку после "coverage.start", и оно работает, как интуиция и подсказывала
The class and def lines are executedwhen the module is imported, not when they are called, so you have tomake sure to begin the coverage analysis before importing your module.
python nose
У него при запуске тестов можно указать, нужно ли использовать проверку покрытия тестов
И вообще он гораздо проще и приятнее, нежели стандартный unittest
Пример с генерируемыми тестами и проверкой покрытия (орфография и пунктуация авторского модуля сохранены )
Очень рекомендую вместо unittest использовать У него при запуске тестов можно указать, нужно ли использовать проверку покрытия тестов
nosetests -v --with-coverage --cover-package=package.to.check --cover-erase ...
И вообще он гораздо проще и приятнее, нежели стандартный unittest
Пример с генерируемыми тестами и проверкой покрытия (орфография и пунктуация авторского модуля сохранены )
$ cat package.py
#!/usr/bin/env python
class Math:
def multy(self, a, b):
return a * b
$ cat test_package.py
#!/usr/bin/env python
import nose
from nose.tools import *
import package
def test_mul:
def _check_mul(f, a, b, r):
assert_equals(f(a, b r, "Incorrect result")
m = package.Math
yield _check_mul, m.multy, 2, 2, 4
yield _check_mul, m.multy, -2, -2, 4
yield _check_mul, m.multy, 2, -2, -4
yield _check_mul, m.multy, 0, 100, 0
$ nosetests -v --with-coverage
test_package.test_mul(<bound method Math.multy of <package.Math instance at 0xa44df8c>>, 2, 2, 4) ... ok
test_package.test_mul(<bound method Math.multy of <package.Math instance at 0xa44df8c>>, -2, -2, 4) ... ok
test_package.test_mul(<bound method Math.multy of <package.Math instance at 0xa44df8c>>, 2, -2, -4) ... ok
test_package.test_mul(<bound method Math.multy of <package.Math instance at 0xa44df8c>>, 0, 100, 0) ... ok
Name Stmts Exec Cover Missing
---------------------------------------
package 3 3 100%
----------------------------------------------------------------------
Ran 4 tests in 0.019s
OK
К тому же прелесть nose в nosetests, а мне проще пользуясь уже изученным unittest'овским API переопределить свой раскрашенный stream для TextTestRunner, а не разбираться куда в nose unittest'овские модули пораспихали и как переименовали.
Т.е. вещь определенно хорошая, но я не вижу чего-то такого особенного, из-за чего бы стоило в ней разбираться (не в nosetests, а в import nose.*). И беглый взгляд показывает, что если nose использовать не из оболочки, а из модуля, то это далеко не проще получится.....
Единственное что мне в nose понравилось существенно больше, так это tags. Но можно вместо них в unittest наборы suite использовать.
p.s. Кстати (не к nose, а к тестированию вдруг кто-нибудь ссылку на таксономию не знает.
но я не вижу чего-то такого особенногоПростое делается просто.
Для тестирования это очень важно. Посмотри какого размера у тебя кусок бессмысленного кода, и какой - осмысленного.
Структурно это те же unittest'ы, совместимые со стандартным по части вызовов.
Но удобнее
PS Может у тебя тесты исполняемые?
--exe Look for tests in python modules that are executable.
Normal behavior is to exclude executable modules,
since they may not be import-safe [NOSE_INCLUDE_EXE]
class MyTest(unittest.TestCase):--exe помог, хотя файлы c справами -rw-rw-r--, без x
def test_mul(self):
m = package.Math
self.assertEqual(m.multy(2, 2 4)
self.assertEqual(m.multy(-2, -2 4)
self.assertEqual(m.multy(2, -2 -4)
self.assertEqual(m.multy(0, 100 0)
if __name__ == '__main__':
import coverage
coverage.use_cache(0)
coverage.start
suite = unittest.TestLoader.loadTestsFromTestCase(MyTest)
unittest.TextTestRunner(verbosity=2).run(suite)
coverage.stop
coverage.report(myfile)
а также необходимость создавать классы для тестов. И это в языке где hello world пишется в один оператор!
Ну, это мне понадобилось, т.к. таким образом могу TextTestRunner вызвать с параметром stream = ColorStream и раскрасить вывод (серый утомляет). А классы, кстати, не необходимость(я их для setUp и tearDown использую): для методов есть unittest.FunctionTestCase.
Оставить комментарий
feliks28
Пытаюсь освоить Ned Batchelder's coverage.py, но засыпаюсь в самом интуитивно простом:Запускаю utest.py и он выдает:
Т.е. "class Math:" и "def multy(self, a, b):" не покрывается... А как для них вообще нужно тесты написать (или что изменить чтобы не пестрили "#pragma: no cover" по всему коду?...