2011-12-26 16 views
13

Estoy tratando de lograr una cobertura del 100% para un módulo básico de python. Uso el módulo coverage.py de Ned Batchelder para probarlo.¿coverage.py mide la función y las definiciones de clase?

1 class account(object): 
2 def __init__(self, initial_balance=0): 
3  self.balance = initial_balance 
4 def add_one(self): 
5 self.balance = self.balance + 1 

Estas son las pruebas.

class TestAccount(unittest.TestCase): 
    def test_create_edit_account(self): 
    a = account1.account() 
    a.add_one() 

Esto es lo que me proporciona el informe de cobertura.

 
    COVERAGE REPORT = 
    Name     Stmts Miss Cover Missing 
    ----------------------------------------------------- 
    __init__     1  1  0% 1 
    account1     5  3 40% 1-2, 4 
    account2     7  7  0% 1-7 

Como podemos ver, las líneas 1-2 y 4 no están cubiertas, que son las definiciones. El resto de las líneas se ejecutan.

Respuesta

14

Creo que su problema se describe en el FAQ:

Q: ¿Por qué los cuerpos de funciones (o clases) muestran como ejecutados, pero las líneas def no?

Esto sucede porque la cobertura se inicia después de que se definieron las funciones . Las líneas de definición se ejecutan sin cobertura medición, luego se inicia la cobertura, luego se llama a la función. Esto significa que se mide el cuerpo, pero la definición de la función no lo está.

Para solucionar esto, comience la cobertura más temprano. Si usa la línea de comando para ejecutar su programa con cobertura, entonces su programa completo será monitoreado. Si está utilizando la API, debe llamar a coverage.start() antes de importar los módulos que definen sus funciones.

+0

! Gracias por la ayuda. Funcionó. – praveen

4

Tras la respuesta de jcollado:

tengo este problema con Django nose que sólo cubre las líneas utilizadas por las pruebas.

Para solucionarlo lanzo en primer lugar manage.py con cobertura y después de iniciar las pruebas. .coverage archivo contendrá los dos informes.

Mi primer comando es a custom que imprime la configuración de mi proyecto. Ejemplo:

coverage run ./manage.py settings && ./manage.py test myapp 
Cuestiones relacionadas