Compartir a través de


Tutorial: Desarrollo basado en pruebas previas con la característica de generación a partir del uso

En este tema se muestra cómo usar la función Generar a partir de uso, que admite el desarrollo basado en pruebas.

El desarrollo primero en pruebas es un enfoque para el diseño de software en el que primero escribe pruebas unitarias basadas en especificaciones de producto y, a continuación, escribe el código fuente necesario para que las pruebas se realicen correctamente. Visual Studio admite el desarrollo dirigido por pruebas mediante la generación de nuevos tipos y miembros en el código fuente al referenciarlos por primera vez en los casos de prueba, antes de definirlos.

Visual Studio genera los nuevos tipos y miembros con una interrupción mínima del flujo de trabajo. Puede crear códigos auxiliares para tipos, métodos, propiedades, campos o constructores sin abandonar su ubicación actual en el código. Al abrir un cuadro de diálogo para especificar opciones para la generación de tipos, el foco vuelve inmediatamente al archivo abierto actual cuando se cierra el cuadro de diálogo.

La característica Generar a partir de uso se puede usar con marcos de pruebas que se integran con Visual Studio. En este tema, se muestra el marco de pruebas unitarias de Microsoft.

Nota:

Las instrucciones de este artículo muestran la versión más reciente de la experiencia de desarrollo interactiva (IDE) disponible en Visual Studio. El equipo puede mostrar nombres o ubicaciones diferentes para algunos de los elementos de la interfaz de usuario. Puede que esté usando una versión diferente de Visual Studio u otra configuración del entorno. Para obtener más información, consulte Personalizar el IDE.

Crear un proyecto de biblioteca de clases de Windows y un proyecto de prueba

  1. En C# o Visual Basic, cree un nuevo proyecto de biblioteca de clases de Windows . Asígnele el GFUDemo_VB o GFUDemo_CS nombre, en función del idioma que use.

  2. En el Explorador de soluciones, haga clic con el botón derecho en el icono de la solución en la parte superior y elija Agregar>nuevo proyecto.

  3. Cree un nuevo proyecto de pruebas unitarias (.NET Framework).

Agregar una referencia al proyecto biblioteca de clases

  1. En el Explorador de soluciones, en el proyecto de prueba unitaria, haga clic con el botón derecho en la entrada Referencias y elija Agregar referencia.

  2. En el cuadro de diálogo Administrador de referencias , seleccione Proyectos y, a continuación, seleccione el proyecto de biblioteca de clases.

  3. Elija Aceptar para cerrar el cuadro de diálogo Administrador de referencias .

  4. Guarde la solución. Ahora ya está listo para empezar a escribir pruebas.

Generación de una nueva clase a partir de una prueba unitaria

  1. El proyecto de prueba contiene un archivo denominado UnitTest1. Haga doble clic en este archivo en el Explorador de soluciones para abrirlo en el editor de código. Se ha generado una clase de prueba y un método de prueba.

  2. Busque la declaración de la clase UnitTest1 y cámbiela por AutomobileTest.

    Nota:

    IntelliSense ahora proporciona dos alternativas para la finalización de instrucciones de IntelliSense: modo de finalización y modo de sugerencia. Use el modo de sugerencia para situaciones en las que se usan clases y miembros antes de definirlos. Cuando se abre una ventana de IntelliSense , puede presionar Ctrl+Alt+Space para alternar entre el modo de finalización y el modo de sugerencia. Consulte Uso de IntelliSense para obtener más información. El modo de sugerencia le ayudará cuando escriba Automobile en el paso siguiente.

  3. Busque el TestMethod1() método y cámbielo por DefaultAutomobileIsInitializedCorrectly(). Dentro de este método, cree una nueva instancia de una clase denominada Automobile, como se muestra en las capturas de pantalla siguientes. Aparece un subrayado ondulado, que indica un error en tiempo de compilación, y una bombilla de error de Acciones rápidas en el margen izquierdo o directamente debajo de la línea ondulada si se sitúa el cursor encima.

    Acciones rápidas en Visual Basic

    Acciones rápidas en C#

  4. Elija o haga clic en la bombilla Acciones rápidas . Verá un mensaje de error que indica que el tipo Automobile no está definido. También se presentan algunas soluciones.

  5. Haga clic en Generar nuevo tipo para abrir el cuadro de diálogo Generar tipo . Este cuadro de diálogo proporciona opciones que incluyen la generación del tipo en un proyecto diferente.

  6. En la lista Proyecto , haga clic en GFUDemo_VB o GFUDemo_CS para indicar a Visual Studio que agregue el archivo al proyecto de biblioteca de clases en lugar del proyecto de prueba. Si aún no está seleccionado, elija Crear nuevo archivo y asígnelo Automobile.cs o Automobile.vb.

    Cuadro de diálogo Generar nuevo tipo

  7. Haga clic en Aceptar para cerrar el cuadro de diálogo y crear el nuevo archivo.

  8. En el Explorador de soluciones, busque en el nodo de proyecto GFUDemo_VB o GFUDemo_CS para comprobar que el nuevo archivo de Automobile.vb o Automobile.cs está ahí. En el editor de código, el foco todavía está en AutomobileTest.DefaultAutomobileIsInitializedCorrectly, lo que le permite seguir escribiendo la prueba con un mínimo de interrupción.

Generar código auxiliar de propiedad

Supongamos que la especificación del producto indica que la Automobile clase tiene dos propiedades públicas denominadas Model y TopSpeed. Estas propiedades se deben inicializar con los valores predeterminados de "Not specified" y -1 por el constructor predeterminado. La siguiente prueba unitaria comprobará que el constructor predeterminado establece las propiedades en sus valores predeterminados correctos.

  1. Agregue la siguiente línea de código al DefaultAutomobileIsInitializedCorrectly método de prueba.

    Assert.IsTrue((myAuto.Model == "Not specified") && (myAuto.TopSpeed == -1));
    
  2. Dado que el código hace referencia a dos propiedades no definidas en Automobile, aparece un subrayado ondulado bajo Model y TopSpeed. Sitúe el cursor encima de Model, haga clic en la bombilla de error de Acciones rápidas y, después, elija Generar propiedad "Automobile.Model" .

  3. Genere código auxiliar para la propiedad TopSpeed de la misma manera.

    En la Automobile clase , los tipos de las nuevas propiedades se deducen correctamente del contexto.

Generar una plantilla para un nuevo constructor

Ahora crearemos un método de prueba que generará un stub de constructor para inicializar las propiedades Model y TopSpeed. Más adelante, vas a agregar más código para completar la prueba.

  1. Agregue el siguiente método de prueba adicional a la AutomobileTest clase .

    [TestMethod]
    public void AutomobileWithModelNameCanStart()
    {
        string model = "Contoso";
        int topSpeed = 199;
        Automobile myAuto = new Automobile(model, topSpeed);
    }
    
  2. Haga clic en la bombilla de error de Acciones rápidas situada debajo de la línea roja ondulada y, luego, haga clic en Generar constructor en "Automobile" .

    En el archivo de clase Automobile, observe que el nuevo constructor ha examinado los nombres de las variables locales que se utilizan en la llamada al constructor, ha encontrado propiedades con los mismos nombres en la clase Automobile y ha proporcionado código en el cuerpo del constructor para almacenar los valores de los argumentos en las propiedades Model y TopSpeed.

  3. Después de generar el nuevo constructor, aparece un subrayado ondulado bajo la llamada al constructor predeterminado en DefaultAutomobileIsInitializedCorrectly. El mensaje de error indica que la Automobile clase no tiene ningún constructor que tome cero argumentos. Para generar un constructor predeterminado explícito que no tenga parámetros, haga clic en la bombilla de error Acciones rápidas y, a continuación, haga clic en Generar constructor en "Automobile".

Generar un código auxiliar para un método

Supongamos que la especificación indica que un nuevo Automobile se puede colocar en un IsRunning estado si sus Model propiedades y TopSpeed se establecen en algo distinto de los valores predeterminados.

  1. Agregue las líneas siguientes al AutomobileWithModelNameCanStart método .

    myAuto.Start();
    Assert.IsTrue(myAuto.IsRunning == true);
    
  2. Haga clic en la bombilla de error de Acciones rápidas de la llamada al método myAuto.Start y luego en Generar método "Automobile.Start" .

  3. Haga clic en la bombilla Acciones rápidas de la IsRunning propiedad y, a continuación, haga clic en Generar propiedad "Automobile.IsRunning".

    La Automobile clase contiene ahora un método denominado Start() y una propiedad denominada IsRunning.

Ejecución de las pruebas

  1. En el menú Prueba , elija Ejecutar>todas las pruebas.

    El comando Ejecutar>todas las pruebas ejecuta todas las pruebas de todos los marcos de pruebas que se escriben para la solución actual. En este caso, hay dos pruebas y ambas fallan, según lo previsto. Falla la DefaultAutomobileIsInitializedCorrectly prueba porque la condición Assert.IsTrue devuelve False. La prueba AutomobileWithModelNameCanStart falla porque el método Start de la clase Automobile lanza una excepción.

    La ventana Resultados de la prueba se muestra en la siguiente ilustración.

    Resultados de pruebas con errores

  2. En la ventana Resultados de pruebas, haga doble clic en cada fila de resultados de prueba para ir a la ubicación de cada prueba.

Implementación del código fuente

  1. Agregue el código siguiente al constructor predeterminado para que las Modelpropiedades , TopSpeed y IsRunning se inicialicen en sus valores predeterminados correctos de "Not specified", -1y False (o false para C#).

    public Automobile()
    {
        this.Model = "Not specified";
        this.TopSpeed = -1;
        this.IsRunning = true;
    }
    
  2. Cuando se llama al método Start, debe establecer el indicador IsRunning en verdadero solo si la propiedad Model o TopSpeed se establecen en un valor diferente de su valor predeterminado. Elimine NotImplementedException del cuerpo del método y agregue el siguiente código.

    public void Start()
    {
        if (this.Model != "Not specified" || this.TopSpeed != -1)
            this.IsRunning = true;
        else
            this.IsRunning = false;
    }
    

Vuelva a ejecutar las pruebas.

  • En el menú Prueba , seleccione Ejecutar y, a continuación, haga clic en Todas las pruebas.

    Esta vez las pruebas son correctas. La ventana Resultados de la prueba se muestra en la siguiente ilustración.

    Resultados de pruebas que se han superado