interbloqueo de prueba xUnit

dapper linq-to-sql xunit.net

Pregunta

Cuando ejecuto mis pruebas de la unidad xUnit a veces recibo un mensaje de error como "Transacción (ID de proceso 58) se estancó en los recursos de bloqueo con otro proceso y se ha elegido como la víctima de interbloqueo" en una o más pruebas, al azar. Si vuelvo a ejecutar cualquier prueba que falla por sí sola, se aprueba.

¿Qué debo hacer para evitar esto? ¿Existe una opción para ejecutar las pruebas una tras otra en lugar de todas a la vez?

(Nota: estoy ejecutando las pruebas sobre los métodos API en mis controladores ASP.Net 5 MVC en Visual Studio 2015)

Aquí hay un ejemplo de una de mis pruebas ocasionalmente fallidas:

[Fact]
private void TestREAD()
{
    Linq2SQLTestHelpers.SQLCommands.AddCollections(TestCollections.Select(collection => Convert.Collection2DB(collection)).ToList(), TestSettings.LocalConnectionString);
    foreach (var testCollection in TestCollections)
    {
        var testCollectionFromDB = CollectionsController.Get(testCollection.Id);
        Assert.Equal(testCollection.Description, testCollectionFromDB.Description);
        Assert.Equal(testCollection.Id, testCollectionFromDB.Id);
        Assert.Equal(testCollection.IsPublic, testCollectionFromDB.IsPublic);
        Assert.Equal(testCollection.LayoutSettings, testCollectionFromDB.LayoutSettings);
        Assert.Equal(testCollection.Name, testCollectionFromDB.Name);
        Assert.Equal(testCollection.UserId, testCollectionFromDB.UserId);
    }
}

Hay dos métodos que la prueba llama, aquí está el método del controlador:

[HttpGet("{id}")]
public Collection Get(Guid id)
{
    var sql = @"SELECT * FROM Collections WHERE id = @id";
    using (var connection = new SqlConnection(ConnectionString))
    {
        var collection = connection.Query<Collection>(sql, new { id = id }).First();
        return collection;
    }
}

y aquí está el método de ayuda:

public static void AddCollections(List<Collection> collections, string connectionString)
{
    using (var db = new DataClassesDataContext(connectionString))
    {
        db.Collections.InsertAllOnSubmit(collections);
        db.SubmitChanges();
    }
}

(Tenga en cuenta que estoy usando Dapper como el micro-ORM en el método del controlador y para evitar posibles errores de duplicación en la prueba, estoy usando LINQ to SQL en lugar de la prueba para configurar y limpiar datos de prueba .)

También hay llamadas a la base de datos en el constructor de la clase de la prueba de la unidad y en el método Dispose. Puedo agregarlos a la publicación si es necesario.

Respuesta aceptada

De acuerdo, parece un caso simple y vago de interbloqueos en su aplicación y la necesidad de manejarlo: ¿cuál es su plan en el lado de la aplicación?

Las pruebas y su manipulación de datos pueden ser presa de lo mismo. xUnit no tiene nada para abordar esto y yo diría que no debería.

Por lo tanto, tanto en la prueba como en la aplicación, necesita una administración de falla / reintento.

En el caso de una aplicación web, tiene una imagen de fuego de una ballena y déjeles intentar de nuevo el patrón, pero en última instancia, desea una solución real.

Para una prueba, no quieres ballenas y definitivamente quieres manejarlo, es decir, no ser frágil.

Usaría Poly para envolver la decoración de reintentos en cualquier cosa, ya sea en la aplicación o en las pruebas propensas a fallas significativas; su ejercicio consiste en descubrir cuáles son las fallas significativas en su contexto.


En circunstancias normales, una base de datos con un solo lector / escritor que funcione de forma sincronizada no debe estancarse. Analizar por qué sucede es una cuestión de hacer el análisis en el lado de DB. Las herramientas de ese lado también podrían revelarle rápidamente si, por ejemplo, usted tiene algún aspecto de su sistema bajo prueba general que resulta en un trabajo competitivo.

(Obviamente, los fragmentos están incompletos, ya que hay una desconexión entre CollectionsController.Get(testCollection.Id) y el hecho de que el método del controlador no es static ; el punto de esta discusión no debería estar abajo en ese nivel, aunque IMO)



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué