Compartir a través de


Organización y prueba de proyectos con la CLI de .NET

Este tutorial sigue tutorial: Creación de una aplicación de consola con .NET mediante Visual Studio Code, que le lleva más allá de la creación de una aplicación de consola sencilla para desarrollar aplicaciones avanzadas y bien organizadas. Después de mostrar cómo usar carpetas para organizar el código, el tutorial muestra cómo ampliar una aplicación de consola con el marco de pruebas xUnit .

Nota:

En este tutorial se recomienda colocar el proyecto de aplicación y probarlo en carpetas independientes. Algunos desarrolladores prefieren mantener estos proyectos en la misma carpeta. Para obtener más información, vea Problema de GitHub dotnet/docs #26395.

Uso de carpetas para organizar el código

Si desea introducir nuevos tipos en una aplicación de consola, puede hacerlo agregando archivos que contienen los tipos a la aplicación. Por ejemplo, si agrega archivos que contienen AccountInformation y MonthlyReportRecords tipos al proyecto, la estructura de archivos del proyecto es plana y fácil de navegar:

/MyProject
|__AccountInformation.cs
|__MonthlyReportRecords.cs
|__MyProject.csproj
|__Program.cs

Sin embargo, esta estructura plana solo funciona bien cuando el tamaño del proyecto es relativamente pequeño. ¿Puede imaginar lo que ocurrirá si agrega 20 tipos al proyecto? Definitivamente, el proyecto no sería fácil de navegar y mantener con tantos archivos abarrotando el directorio raíz del proyecto.

Para organizar el proyecto, cree una nueva carpeta y asígne un nombre a Models para almacenar los archivos de tipo. Coloque los archivos de tipo en la carpeta Models :

/MyProject
|__/Models
   |__AccountInformation.cs
   |__MonthlyReportRecords.cs
|__MyProject.csproj
|__Program.cs

Los proyectos que agrupan lógicamente archivos en carpetas son fáciles de navegar y mantener. En la sección siguiente, creará un ejemplo más complejo con carpetas y pruebas unitarias.

Organizar y probar con el ejemplo de NewTypes Pets

Prerrequisitos

Creación del ejemplo

Para los pasos siguientes, puede seguir los pasos que se indican a continuación mediante el ejemplo newTypes Pets o crear sus propios archivos y carpetas. Los tipos se organizan lógicamente en una estructura de carpetas que permite la adición de más tipos más adelante, y las pruebas también se colocan lógicamente en carpetas que permiten agregar más pruebas más adelante.

El ejemplo contiene dos tipos, Dog y Cat, y los hace implementar una interfaz común, IPet. Para el NewTypes proyecto, el objetivo es organizar los tipos relacionados con mascotas en una carpeta Pets . Si se agrega otro conjunto de tipos más adelante, WildAnimals , por ejemplo, se colocan en la carpeta NewTypes junto con la carpeta Pets . La carpeta WildAnimals puede contener tipos para animales que no son mascotas, como Squirrel y Rabbit tipos. De este modo, a medida que se agregan tipos, el proyecto permanece bien organizado.

Cree la siguiente estructura de carpetas con el contenido del archivo indicado:

/NewTypes
|__/src
   |__/NewTypes
      |__/Pets
         |__Dog.cs
         |__Cat.cs
         |__IPet.cs
      |__Program.cs
      |__NewTypes.csproj

IPet.cs:

using System;

namespace Pets
{
    public interface IPet
    {
        string TalkToOwner();
    }
}

Dog.cs:

using System;

namespace Pets
{
    public class Dog : IPet
    {
        public string TalkToOwner() => "Woof!";
    }
}

Cat.cs:

using System;

namespace Pets
{
    public class Cat : IPet
    {
        public string TalkToOwner() => "Meow!";
    }
}

Program.cs

using System;
using Pets;
using System.Collections.Generic;

namespace ConsoleApplication
{
    public class Program
    {
        public static void Main(string[] args)
        {
            List<IPet> pets = new List<IPet>
            {
                new Dog(),
                new Cat()
            };

            foreach (var pet in pets)
            {
                Console.WriteLine(pet.TalkToOwner());
            }
        }
    }
}

NewTypes.csproj:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net8.0</TargetFramework>
    <Nullable>enable</Nullable>
  </PropertyGroup>

</Project>

Ejecute el comando siguiente:

dotnet run

Obtenga la siguiente salida:

Woof!
Meow!

Ejercicio opcional: puede agregar un nuevo tipo de mascota, como un Bird, ampliando este proyecto. Haga que el método TalkToOwner de las aves proporcione Tweet! al propietario. Vuelva a ejecutar la aplicación. La salida incluirá Tweet!

Prueba del ejemplo

El proyecto NewTypes está en marcha y lo organizaste manteniendo los tipos relacionados con las mascotas en una carpeta. A continuación, cree el proyecto de prueba y empiece a escribir pruebas con el marco de pruebas xUnit . Las pruebas unitarias le permiten comprobar automáticamente el comportamiento de los tipos de mascotas para confirmar que funcionan correctamente.

Vuelva a la carpeta src y cree una carpeta de prueba con una carpeta NewTypesTests dentro de ella. En una línea de comandos desde la carpeta NewTypesTests, ejecute dotnet new xunit. Este comando genera dos archivos: NewTypesTests.csproj y UnitTest1.cs.

El proyecto de prueba no puede probar actualmente los tipos en NewTypes y requiere una referencia de proyecto al NewTypes proyecto. Para agregar una referencia de proyecto, use el dotnet reference add comando :

dotnet reference add ../../src/NewTypes/NewTypes.csproj

También tiene la opción de agregar manualmente la referencia del proyecto agregando un <ItemGroup> nodo al archivo NewTypesTests.csproj :

<ItemGroup>
  <ProjectReference Include="../../src/NewTypes/NewTypes.csproj" />
</ItemGroup>

NewTypesTests.csproj:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net8.0</TargetFramework>
    <Nullable>enable</Nullable>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.10.0" />
    <PackageReference Include="xunit" Version="2.8.1" />
    <PackageReference Include="xunit.runner.visualstudio" Version="2.8.1" />
  </ItemGroup>

  <ItemGroup>
    <ProjectReference Include="../../src/NewTypes/NewTypes.csproj"/>
  </ItemGroup>

</Project>

El archivo NewTypesTests.csproj contiene las siguientes referencias de paquete:

  • Microsoft.NET.Test.Sdk, la infraestructura de pruebas de .NET
  • xunit, el marco de pruebas de xUnit
  • xunit.runner.visualstudio, el ejecutor de pruebas
  • NewTypes, el código que se va a probar.

Cambie el nombre de UnitTest1.cs a PetTests.cs y reemplace el código del archivo por el código siguiente:

using System;
using Xunit;
using Pets;

public class PetTests
{
    [Fact]
    public void DogTalkToOwnerReturnsWoof()
    {
        string expected = "Woof!";
        string actual = new Dog().TalkToOwner();

        Assert.NotEqual(expected, actual);
    }

    [Fact]
    public void CatTalkToOwnerReturnsMeow()
    {
        string expected = "Meow!";
        string actual = new Cat().TalkToOwner();

        Assert.NotEqual(expected, actual);
    }
}

Ejercicio opcional: Si anteriormente agregó un Bird tipo que le reporta un Tweet! al propietario, agregue un método de prueba al archivo PetTests.csBirdTalkToOwnerReturnsTweet para comprobar que el método TalkToOwner funciona correctamente para el tipo Bird.

Nota:

Aunque espere que los valores expected y actual sean iguales, la aserción inicial con la comprobación Assert.NotEqual especifica que estos valores no son iguales. Siempre cree inicialmente una prueba que falle para verificar la lógica de la prueba. Después de confirmar que la prueba falla, ajusta la aserción para permitir que la prueba pase.

A continuación se muestra la estructura completa del proyecto:

/NewTypes
|__/src
   |__/NewTypes
      |__/Pets
         |__Dog.cs
         |__Cat.cs
         |__IPet.cs
      |__Program.cs
      |__NewTypes.csproj
|__/test
   |__NewTypesTests
      |__PetTests.cs
      |__NewTypesTests.csproj

Inicie en el directorio test/NewTypesTests . Ejecute las pruebas con el dotnet test comando . Este comando inicia el ejecutor de pruebas especificado en el archivo del proyecto.

Como se esperaba, se produce un error en las pruebas y la consola muestra la siguiente salida:

Test run for C:\Source\dotnet\docs\samples\snippets\core\tutorials\testing-with-cli\csharp\test\NewTypesTests\bin\Debug\net5.0\NewTypesTests.dll (.NETCoreApp,Version=v5.0)
Microsoft (R) Test Execution Command Line Tool Version 16.8.1
Copyright (c) Microsoft Corporation.  All rights reserved.

Starting test execution, please wait...
A total of 1 test files matched the specified pattern.
[xUnit.net 00:00:00.50]     PetTests.DogTalkToOwnerReturnsWoof [FAIL]
  Failed PetTests.DogTalkToOwnerReturnsWoof [6 ms]
  Error Message:
   Assert.NotEqual() Failure
Expected: Not "Woof!"
Actual:   "Woof!"
  Stack Trace:
     at PetTests.DogTalkToOwnerReturnsWoof() in C:\Source\dotnet\docs\samples\snippets\core\tutorials\testing-with-cli\csharp\test\NewTypesTests\PetTests.cs:line 13

Failed!  - Failed:     1, Passed:     1, Skipped:     0, Total:     2, Duration: 8 ms - NewTypesTests.dll (net5.0)

Cambie las aserciones de las pruebas de Assert.NotEqual a Assert.Equal:

using System;
using Xunit;
using Pets;

public class PetTests
{
    [Fact]
    public void DogTalkToOwnerReturnsWoof()
    {
        string expected = "Woof!";
        string actual = new Dog().TalkToOwner();

        Assert.Equal(expected, actual);
    }

    [Fact]
    public void CatTalkToOwnerReturnsMeow()
    {
        string expected = "Meow!";
        string actual = new Cat().TalkToOwner();

        Assert.Equal(expected, actual);
    }
}

Vuelva a ejecutar las pruebas con el dotnet test comando y obtenga la siguiente salida:

Test run for C:\Source\dotnet\docs\samples\snippets\core\tutorials\testing-with-cli\csharp\test\NewTypesTests\bin\Debug\net5.0\NewTypesTests.dll (.NETCoreApp,Version=v5.0)
Microsoft (R) Test Execution Command Line Tool Version 16.8.1
Copyright (c) Microsoft Corporation.  All rights reserved.

Starting test execution, please wait...
A total of 1 test files matched the specified pattern.

Passed!  - Failed:     0, Passed:     2, Skipped:     0, Total:     2, Duration: 2 ms - NewTypesTests.dll (net5.0)

Pruebas superadas. Los métodos de los tipos de mascota devuelven los valores correctos al dirigirse al propietario.

Ha aprendido técnicas para organizar y probar proyectos mediante xUnit. Continúe con estas técnicas aplicándolas en sus propios proyectos. Disfrute programando.