La bisección es un método utilizado en el desarrollo de software para identificar conjuntos de cambios que dan como resultado un cambio de comportamiento específico. Se emplea principalmente para encontrar el parche que introdujo un error . Otra área de aplicación es encontrar el parche que corrigió indirectamente un error.
El proceso de localizar el conjunto de cambios que introdujo una regresión específica fue descrito como "aislamiento de cambio de fuente" en 1997 por Brian Ness y Viet Ngo de Cray Research . Las pruebas de regresión se realizaron en los compiladores de Cray en ediciones que comprenden uno o más conjuntos de cambios. Las ediciones con regresiones conocidas no se pudieron validar hasta que los desarrolladores abordaron el problema. El aislamiento del cambio de fuente redujo la causa a un único conjunto de cambios que luego podría excluirse de las ediciones, desbloqueándolos con respecto a este problema, mientras el autor del cambio trabajaba en una solución. Ness y Ngo describieron la búsqueda lineal y los métodos de búsqueda binaria para realizar este aislamiento.[1]
La bisección de código tiene el objetivo de minimizar el esfuerzo para encontrar un conjunto de cambios específico. Emplea un algoritmo de divide y vencerás que depende de tener acceso al historial del código que generalmente se conserva mediante el control de revisión en un repositorio de código .
El historial de código tiene la estructura de un gráfico acíclico dirigido que se puede clasificar topológicamente . Esto hace posible utilizar un algoritmo de búsqueda de divide y vencerás que:
La bisección tiene en LSPACE una complejidad algorítmica de con denotar el número de revisiones en el espacio de búsqueda, y es similar a una búsqueda binaria .
Para la bisección de código, es deseable que cada revisión en el espacio de búsqueda se pueda construir y probar de forma independiente.
Para que el algoritmo de bisección identifique un único conjunto de cambios que provocó que el comportamiento que se está probando cambie, el comportamiento debe cambiar monótonamente en el espacio de búsqueda. Para una función booleana como una prueba de aprobado / reprobado, esto significa que solo cambia una vez en todos los conjuntos de cambios entre el inicio y el final del espacio de búsqueda.
Si hay varios conjuntos de cambios en el espacio de búsqueda donde el comportamiento que se está probando cambia entre falso y verdadero, entonces el algoritmo de bisección encontrará uno de ellos, pero no será necesariamente la causa raíz del cambio de comportamiento entre el inicio y el final. del espacio de búsqueda. La causa raíz podría ser un conjunto de cambios diferente o una combinación de dos o más conjuntos de cambios en el espacio de búsqueda. Para ayudar a lidiar con este problema, las herramientas automatizadas permiten ignorar conjuntos de cambios específicos durante una búsqueda de bisección.
Aunque el método de bisección se puede completar manualmente, una de sus principales ventajas es que se puede automatizar fácilmente. [1] Por lo tanto, puede encajar en los procesos de automatización de pruebas existentes : las fallas en las pruebas de regresión automatizadas exhaustivas pueden desencadenar una bisección automatizada para localizar fallas. Ness y Ngo se centraron en su potencial en el entorno de estilo de entrega continua de Cray en el que el conjunto de cambios incorrecto aislado automáticamente podría excluirse automáticamente de las compilaciones. [2]
Los sistemas de control de revisiones Fossil , Git y Mercurial tienen una funcionalidad incorporada para la bisección de código. [3] [4] [5] El usuario puede iniciar una sesión de bisección con un rango específico de revisiones de las cuales el sistema de control de revisiones propone una revisión para probar, el usuario le dice al sistema si la revisión fue probada como "buena" o "mala". ", y el proceso se repite hasta que se identifica la revisión" incorrecta "específica. Otros sistemas de control de revisiones, como Bazaar o Subversion , admiten la bisección a través de complementos [6] o scripts externos. [7]
Phoronix Test Suite puede realizar bisecciones automáticamente para encontrar regresiones de rendimiento.