Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

331
Visualizações
Busque la causa raíz de la prueba escamosa en Python

Hay una prueba escamosa y no tenemos idea de cuál podría ser la causa raíz.

 with pytest.raises(foo.geocoder.GeocodingFailed): foo.geocoder.geocode('not a valid place')

A veces la excepción no sucede.

Miré los documentos sobre cómo manejar fallas , pero esto no ayudó.

¿Cómo rastrear geocode() para que, si la excepción no ocurre, vea un rastro?

Miré el módulo de trace de la biblioteca estándar. Pero parece que no hay una manera fácil de obtener el rastro como una cadena.

Con "un rastro" quiero decir: un rastro de todas las líneas que se ejecutaron durante gecode() . Me gustaría ver llamadas a métodos y declaraciones de devolución con sangría. Quiero ignorar las líneas de la biblioteca estándar de Python.

AFAIK, un depurador como pdb no ayuda aquí, ya que la prueba solo falla cuando se ejecuta en CI, y solo una o dos veces al mes.

over 4 years ago · Santiago Trujillo
3 Respostas
Responde à pergunta

0

La biblioteca de trace no ayuda, ya que no permite escribir en una string o en un objeto StringIO , solo escribe en archivos reales .

Lo que puede hacer es usar sys.settrace() y definir una función simple, que se llama para cada ejecución. Encontrará la documentación aquí: https://docs.python.org/3/library/sys.html#sys.settrace . La magia básica es obtener los detalles del objeto frame , que se documenta aquí: https://docs.python.org/3/library/inspect.html .

Una muestra para darle una idea se ve así:

 import sys def tracer(frame, event, arg): print(frame.f_code.co_name, frame.f_code.co_filename, frame.f_lineno, event, arg) def bad_function(param: int): if param == 20: raise RuntimeError(f'that failed for {param}') sys.settrace(tracer) bad_function(1) bad_function(20) bad_function(2)

Debería ser fácil almacenar esa información en una cadena para una mayor investigación, o para manejar la excepción, si se genera.

over 4 years ago · Santiago Trujillo Relatório

0

¿Ha intentado usar pytest-repeat con --pdb .

Algo como pytest test_geocode.py --count 10 --pdb . Esto podría funcionar si su CI funciona en un contenedor docker y puede conectarse al contenedor.

Alternativamente, Jenkins le permite hacer una pausa en caso de falla y luego investigar de esa manera, pero dado que es inestable y solo ocurre una o dos veces al mes, entonces, literalmente, agrega el indicador --pdb para que sea parte del CI para que pueda conectarse cada vez que suceda. . Necesitaría una forma de notificarle que ha ingresado a este flujo, aunque de lo contrario la compilación puede agotarse. Pero si vigila de cerca sus compilaciones, puede que no sea un problema.

Además, si aún no está usando pytest-html , puede valer la pena integrarlo para obtener un buen informe de lo que sucedió (a través de líneas de registro) y lo que falló o simplemente usando

pytest test_geocode.py --log-file=/path/to/log/file --log-file-level=DEBUG .

Adjuntar el informe html de pytest o el archivo de registro como artefactos a las compilaciones fallidas permitirá una mejor depuración.

over 4 years ago · Santiago Trujillo Relatório

0

El módulo de trace brinda acceso programático a través de la clase trace.Trace .
En las fallas de prueba, la salida de la consola de la clase Trace es visible.
Y tiene informe de cobertura para escribir en la ruta elegida.

sys.base_exec_prefix , sys.base_prefix para no rastrear los módulos de la biblioteca de Python.

 import pytest def f(x): import random choice = random.choice((True, False)) if choice: raise ValueError else: return x * 2 def trace(f, *args, **kwargs): import trace import sys tracer = trace.Trace( ignoredirs=(sys.base_exec_prefix, sys.base_prefix), timing=True, ) ret = tracer.runfunc(f, *args, **kwargs) r = tracer.results() r.write_results(coverdir="/tmp/xx-trace") return ret def test_f(): with pytest.raises(ValueError): trace(f, 3)

ejecución de prueba

informe de cobertura;
Las líneas marcadas con >>>>>> no se ejecutaron, es decir, no se rastrearon y los números con dos puntos son recuentos de ejecución.

 >>>>>> import pytest >>>>>> def f(x): 1: import random 1: choice = random.choice((True, False)) 1: if choice: >>>>>> raise ValueError else: 1: return x * 2 >>>>>> def trace(f, *args, **kwargs): >>>>>> import trace >>>>>> import sys >>>>>> tracer = trace.Trace( >>>>>> ignoredirs=(sys.base_exec_prefix, sys.base_prefix), timing=True, ) >>>>>> tracer.runfunc(f, *args, **kwargs) >>>>>> r = tracer.results() >>>>>> r.write_results(coverdir="/tmp/xx-trace") >>>>>> def test_f(): >>>>>> with pytest.raises(ValueError): >>>>>> trace(f, 3)
over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda