Question

Mon application

J'ai une conception de l'application qui ressemble à ceci:

  • couche d'application Web - asp.net MVC application avec des contrôleurs et des vues qui utilisent Poços et services d'appels
  • couche service - processus d'affaires qui utilisent des Poços et dépôts d'appels
  • données couche - dépôts qui utilisent Poços et communiquent avec le modèle sous la forme de modèle EF qui fait partie de cette même couche
  • couche POCO - définit toutes les classes qui sont utilisés pour la communication inter entre ces couches

Donc, ma couche de données est totalement transparent pour la mise en œuvre du modèle de données, car la couche supérieure ne pas utiliser des entités de données du tout.

Test

Autant que je comprends l'unité, l'intégration et les tests du système (par rapport à Asp.net MVC) est la suivante:

  • les tests unitaires - celui-ci est facile. Mock objets découplé et injectez les dans votre test unitaire unité donc testé les utilisera
  • les tests d'intégration - devrait faire un groupe d'unités de fonctionnalité de production et de railler le reste: les tests d'intégration afin d'écriture qui commande l'essai, le service et l'intégration du référentiel sans réellement utiliser la base de données de production
  • test du système - tests effectués sur toutes les couches sans aucune base de données moqueur, ce qui signifie que je dois à la production d'utilisation (test) et

Problème

Je peux facilement voir comment écrire des tests unitaires ainsi que des tests de système, mais je ne sais pas comment écrire des tests d'intégration? Peut-être que mon avis de ces derniers est complètement déformée et je ne les comprends pas du tout.

Comment doit-on les tests d'intégration d'écriture et un système pour une application Asp.net MVC? Ou toute application .net pour cette question?

code qui permet d'expliquer le problème

Supposons que j'ai des classes comme:

  • appels TaskController dans TaskService
  • appels TaskService dans TaskRepository
  • TaskRepository manipuler des données EF interne

Alors voici mes (abrégés) des classes:

public class TaskController
{
    private ITaskService service;

    // injection constructor
    public TaskController(ITaskService service)
    {
        this.service = service;
    }

    // default constructor
    public TaskController() : this(new TaskService()) {}

    public ActionResult GetTasks()
    {
        return View(this.service.GetTasks());
    }
    ...
}

public class TaskService : ITaskService
{
    private ITaskRepository repository;

    // injection constructor
    public TaskService(ITaskRepository repository)
    {
        this.repository = repository;
    }

    // default constructor
    public TaskService() : this(new TaskRepository()) {}

    public IList<Task> GetTasks()
    {
        return this.repository.GetTasks();
    }
    ...
}

public class TaskRepository : ITaskRepository
{
    public IList<Task> GetTasks()
    {
        // code that gets tasks from EF and converts to Task POCOs
    }
    ...
}

test de l'unité est simple et ressemblerait à ceci:

public void UnitTest()
{
    var mock = new Mock<ITaskService>();
    // other code that mocks the service

    TaskController controller = new TaskController(mock.Object);

    // do the test
}

Mais quand il vient à un test d'intégration, comment puis-je me moque que certaines parties de l'intégration.

public void IntegrationTest()
{
    // no mocking at all
    TaskController = new TaskController();
    // do some testing
}

Tout d'abord je ne peux pas simplement la base de données maquette ici? Je pourrais se moquer de dépôt et avoir un réel service et contrôleur si ...

Était-ce utile?

La solution

Tests d'intégration devrait tester l'intégration entre les composants. Alors que les tests unitaires tester des morceaux individuels d'un composant unique, l'intégration teste les interactions entre les composants, et sont destinés à travailler en direct. Donc, un test d'intégration utiliserait une base de données et d'autres dépendances externes, où son mieux pour se moquer de ces services dans les tests unitaires.

test du système me serait tests fonctionnels (un autre niveau de test en utilisant quelque chose comme forme), ou tester ui par un outil comme TestComplete ou l'outil QA de telerik.

HTH.

Autres conseils

Tests d'intégration qui ne concernent pas l'interface utilisateur peut encore être écrit dans NUnit, xUnit, etc.

Pour ASP.NET MVC en particulier (ou toute application Web), vous pouvez utiliser Watin ou sélénium au système d'écriture / tests d'intégration à l'aide de l'interface utilisateur.

Vous pouvez également regarder TST pour les tests unitaires T-SQL, et SpecFlow si vous êtes curieux de BDD dans .NET.

Note: J'ai écrit ce avant que la question a été mise à jour avec le code et une description de la situation spécifique. Il ne traite pas vraiment la question plus, mais nous espérons sera toujours intéressant / utile à quelqu'un.

Je viens répondu à une question connexe: Tests d'intégration mise en œuvre . Je pense qu'il a abordé la question ici, en présentant une approche claire à prendre.

Une partie du problème est que les tests d'intégration de haut niveau se v trop complexe. Rapidement. C'est la nature du problème, donc je préfère assurer que tous les travaux de morceaux séparés comme prévu, par le biais des tests unitaires et tests d'intégration axé en fonction de la classe concernée.

Avec ce qui précède en place, il vous suffit de vous assurer que les pièces séparées sont correctement accroché, donc j'utiliser les tests complets du système pour cela. Cela a le meilleur de son effet si le code suit sec et solide.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top