¿Estas pruebas de la unidad cubren mi método en prueba? -- # campo con unit-testing camp codereview Relacionados El problema

Do these unit tests cover my method under test?


3
vote

problema

Español

He escrito un método de extensión para truncar las cadenas:

  board_move!3  

He escrito estos casos de prueba:

  board_move!4  

Ahora, ¿cómo puedo confirmar que:

  1. el método board_move!5 hace lo que se supone que debe hacer?
  2. ¡He escrito el código de prueba para probar al promesas Hechas?
  3. Este código de prueba sigue las prácticas y las directrices válidas para las pruebas de la unidad?

Estoy especialmente curioso sobre el último. He escrito algunas pruebas en mi tiempo, pero nunca estoy seguro de que estoy probando lo suficiente y no estoy demasiado al mismo tiempo. ¿Alguien puede arrojar una luz general sobre esto y quizás me apunte hacia recursos invaluables sobre las pruebas de la unidad?

Original en ingles

I've written an extension method to truncate strings:

/// <summary> /// Returns the string, or a substring of the string with a length of <paramref name="maxLength"/> if the string is longer than maxLength.  /// </summary> /// <param name="maxLength">The maximum length of the string to return.</param> /// <exception cref="ArgumentException">If <paramref name="maxLength"/> is smaller than zero, an ArgumentException is raised.</exception> /// <![CDATA[ Documentation: /// If the string is null or an empty string, the input is returned. /// If the string is shorter than or equal to maxLength, the input is returned. /// If the string is longer than maxLength, the first N (where N=maxLength) characters of the string are returned.  /// ]]> public static String Truncate(this String input, int maxLength) {     if (maxLength < 0)     {         throw new ArgumentException("Must be >= 0", "maxLength");     }      if (String.IsNullOrEmpty(input) || input.Length <= maxLength)     {         return input;     }      return input.Substring(0, maxLength); } 

I have written these test cases:

[TestFixture] public class TruncateTests {     String longString = "ABC";     String shortString = "A";     String nullOrEmptyString = null;     String output = "";      [Test]     public void LessThanOrEqual()     {         // If input is shorter than or equal to maxLength, the input is returned.         output = longString.Truncate(longString.Length + 5);         Assert.AreEqual(longString, output);          output = longString.Truncate(longString.Length);         Assert.AreEqual(longString, output);     }      [Test]     public void GreaterThan()     {         // If input is longer than maxLength, the first N (where N=maxLength) characters of input are returned.         output = longString.Truncate(1);         Assert.AreEqual(shortString, output);     }      [Test]     public void NullOrEmpty()     {         // If input is null or an empty string, input is returned.         output = nullOrEmptyString.Truncate(42);         Assert.AreEqual(output, nullOrEmptyString);          nullOrEmptyString = "";         output = nullOrEmptyString.Truncate(42);         Assert.AreEqual(output, nullOrEmptyString);     }      [ExpectedException(typeof(ArgumentException))]     [Test]     public void MaxLengthException()     {         // If maxLength is smaller than zero, an ArgumentException is raised.         "".Truncate(-1);     }      //http://www.fileformat.info/info/unicode/char/1f3bc/index.htm     string multiByteString = "\x1F3BC";      [Test]     public void MultiByte()     {         Assert.IsTrue(multiByteString.Length == 2);          output = multiByteString.Truncate(1);          Assert.IsTrue(output.Length == 1);     } } 

Now how can I confirm that:

  1. The method Truncate() does what it is supposed to do?
  2. I have written test code to test al promises made?
  3. This test code follows practices and guidelines valid for unit testing?

I'm especially curious about the last one. I've written a few tests in my time, but I'm never sure whether I'm testing enough and not too much at the same time. Can anyone shed a general light on this and maybe point me towards invaluable resources about unit testing?

     
     
     

Lista de respuestas

5
 
vote
vote
La mejor respuesta
 
  1. sobre la función Comentario:

    Estás sobre-complicando el resumen. A partir de cómo entiendo la función Get the first <paramref="maxLength"> characters como un resumen. Las condiciones especiales se mencionan a continuación. Aquellos deben ser simplificados también.

  2. para maxLength Cheque por MIN / MAX INTEGER, así como para -1/0/1 (¿la función se comportan correctamente en los límites?)

    < / li>
  3. Comprobar input Para null y adicionalmente para aquellas combinaciones:

    • input.length & lt; maxlength
    • input.length = maxlength
    • input.length & gt; maxlength
  4. No está probando su código cuando se prueban para la funcionalidad de MB.

  5. prueba una cosa a la vez. Si 9988776655544334 falla, ¿cómo sabe cuál de esas afirmaciones falló? ¿Falla si input está vacío o si es null ?

  6. Eliminar comentarios, haga que los nombres de las pruebas sean más claros en su lugar. Las pruebas son simples y fáciles de entender (al menos deberían ser :)). Caja fuerte su tiempo de escribir comentarios y mejore la prueba.

    • Para la mayoría de las funciones, simplemente estás repitiendo el comportamiento afirmado. Sin embargo, esto ya está escrito por la afirmación en sí. El comentario simplemente duplica el código.
    • En mi opinión, los nombres de las pruebas deben estar hablando de lo que hacen. NullOrEmpty no afuera nada sobre lo que sucede realmente. NullInputReturnsNull y EmptyInputReturnsEmptyString haz sin embargo. Además, los nombres de las pruebas pueden usarse como documentación (es decir, TESTDOX).
  7. ¿Cuándo has terminado? Nunca. Finalmente, usted (o otra persona) encontrará errores, mal comportamiento, ... (por ejemplo, durante la integración). Es más importante mantener las pruebas actualizadas en aquellos momentos también.

actualización

en 2. Estoy probando MAX_INT porque su promesa es que estas funciones acepta valores enteros entre [0, MAX_INT]. Imagínese en algún momento, hay una declaración 99887766655443310 por alguna razón. Como regla general: pruebe siempre los valores fronterizos de los parámetros. Lectura adicional: partición de equivalencia y Análisis de valor límite

en 3. que serían cuatro pruebas. Debes dividir esos.

en 4. El punto es que están probando la biblioteca C #, no su código. No tienes ningún código dedicado para el manejo de MB. Lo que realmente está haciendo es probar el método maxLength1 9988776655543312 propiedad para el manejo de MB.

 
  1. About the function comment:

    You're over-complicating the summary. As of how I understand the function does Get the first <paramref="maxLength"> characters as a summary. Special conditions are mentioned bellow. Those should be simplified as well.

  2. For maxLength I'd check for min/max integer as well as for -1/0/1 (does the function behave correctly at the limits?)

  3. Check input for null and additionally for those combinations:

    • input.length < maxLength
    • input.length = maxLength
    • input.length > maxLength
  4. You're not testing your code when testing for MB-functionality.

  5. Test one thing at a time. If NullOrEmpty fails, how to you know which of those assertions failed? Does it fail if input is empty or if it is null?\

  6. Remove comments, make the test-names more clear instead. Tests are simple and easy to understand (at least they should be :)). Safe your time of writing comments and improve the test instead.

    • For most of the functions you're just repeating the behavior asserted. However this is already written down by the assertion itself. The comment just duplicates the code.
    • In my opinion, test names should be speaking of what they do. NullOrEmpty doesn't state anything about what actually happens. NullInputReturnsNull and EmptyInputReturnsEmptyString do however. Furthermore speaking test-names can be used as a documentation (i.e testdox).
  7. When are you done? Never. Eventually you (or someone else) will find bugs, misbehavior, ... (e.g. during integration). It's more important to keep the tests up to date at those times as well.

Update

On 2. I'm testing for MAX_INT because your promise is this functions accepts integer values between [0, MAX_INT]. Imagine at some time there is a maxLength + 1 statement for some reason. As a rule of thumb: always test the border values of parameters. Further reading: equivalence partitioning and boundary value analysis

On 3. That'd be four tests. You should split those.

On 4. The point is your are testing the c# library, not your code. You don't have any code dedicated for MB handling. What you are actually doing is testing the Substring method and Length property for MB handling.

 
 
         
         

Relacionados problema

6  Funciones de prueba de rendimiento para envolver un índice  ( Performance testing functions for wrapping an index ) 
Después de preguntarle a esta pregunta < / A>, decidí escribir una prueba y determinar la forma más rápida de envolver un índice (donde mi 99887766555443325...

8  Prueba de registro multithread  ( Multithreaded log test ) 
Estoy escribiendo una extensión de registrador que permite que varios subprocesos registren un proceso, y luego voltee ese registro en el registro principal e...

4  Comparaciones de concatenación de cadena  ( String concatenation comparisons ) 
Por algún tiempo, la concatenación de cadena JavaScript podría optimizarse mediante join() ING Una matriz de cadenas, en lugar de 9988777665544331 juntos....

5  Calcular el cumplimiento de la asistencia basado en el registro de asistencia  ( Calculate attendance compliance based on attendance record ) 
Esto es parte de un sistema de trabajo más grande que ahora estoy tratando de limpiar. En los intereses de hacer que el sistema sea más probado, puedo dividir...

11  ¿Se pueden mejorar estas pruebas de la unidad?  ( Can these unit tests be improved ) 
No soy el más grande en las pruebas de escritura aún y estoy iniciando un nuevo proyecto OSS para aprender y, como parte, quiero abordar ser más efectivo en l...

3  Implementación de clasificación de burbujas con pruebas  ( Bubble sort implementation with tests ) 
Para la práctica, intenté implementar un algoritmo de clasificación de burbujas en Ruby. Estoy especialmente interesado en crear código limpio y beso y manten...

4  ¿Están las pruebas de mi unidad?  ( Are my unit tests any good ) 
Esta es la primera vez que he escrito pruebas de unidad. Estoy probando el código que ya he escrito y me gustaría pasar a TDD una vez que haya logrado obtener...

1  ¿Está construyendo una instancia de prueba de una mezcla de objetos simulacros y reales?  ( Is building a test instance from a mix of both mock and real objects ok ) 
Soy nuevo en las pruebas de Android y me gustaría comenzar a comenzar en la dirección correcta, por lo que estoy tratando de entender si esta es la forma corr...

13  Funda de prueba para una biblioteca de almacenamiento en caché  ( Test case for a caching library ) 
Esto muestra un caso de prueba para una antigua biblioteca de almacenamiento en caché que uso para un proyecto. Cuenta con funciones simples de guardar / carg...

2  Pruebas de unidad - Herencia de la clase de prueba vs Clase de prueba única [cerrada]  ( Unit testing test class inheritance vs single test class ) 
cerrado . Esta pregunta es basada en opinión . Actualmente no está aceptando respuestas. ¿...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos