GNU/Linux >> Tutoriels Linux >  >> Panels >> Docker

Détecter qu'une application .NET Core est en cours d'exécution dans un conteneur Docker et SkippableFacts dans XUnit

J'ai déplacé mon site de podcast vers ASP.NET Core 2.1 et je l'ai exécuté dans un Docker récipient. Prenez un moment pour consulter certains des articles du blog, car j'ai blogué pendant que j'apprenais.

J'ai ajouté des tests unitaires ainsi que des tests au sélénium qui sont également exécutés avec le XUnit Unit Test Runner. Cependant, je ne veux pas que ces tests Selenium qui automatisent Google Chrome s'exécutent dans le contexte de Docker.

J'ai essayé d'ajouter une variable d'environnement dans mon Dockerfile comme ceci :

ENV INDOCKER=1

J'ai pensé que je vérifierais cette variable et que je sauterais conditionnellement les tests. Simple, non ? Eh bien, j'ai décidé de LIRE réellement les fichiers Docker que mon application ASP.NET Core 2.1 utilise. N'oubliez pas que les Dockerfiles (et les images qui en résultent) sont en couches et, avec tout ce qui concerne .NET, sont Open Source.

En regardant mes propres calques et en explorant la source sur Github, je vois que j'utilise :

  • microsoft/dotnet:2.1-aspnetcore-runtime sur Alpine - .NET Core et ASP.NET Core
    • Dedans, je vois qu'ils définissent "ASPNETCORE_VERSION" comme variable d'environnement, ce qu'il est utile de savoir.
      ENV ASPNETCORE_VERSION 2.1.1
  • microsoft/dotnet:2.1-runtime-deps-alpine3.7 - Dépendances nécessaires pour .NET Core
    • Je peux voir qu'il écoute sur le port 80, mais il définit également une variable d'environnement utile !
      ENV DOTNET_RUNNING_IN_CONTAINER=true

Bien, je n'ai donc pas besoin de définir quoi que ce soit pour savoir que j'exécute .NET dans un conteneur ! Je n'aurais rien su de tout cela si je n'avais pas pris 15 minutes et exploré/affirmé/confirmé ma pile. Ce n'est pas parce que j'utilise des conteneurs Docker qu'il n'est pas utile de prendre le temps de SAVOIR ce que j'utilise ! Affirmez vos hypothèses et tout ça, n'est-ce pas ?

J'ai ajouté une petite aide dans mes Tests :

private bool InDocker { get { return Environment.GetEnvironmentVariable("DOTNET_RUNNING_IN_CONTAINER") == "true";} }

Depuis que j'utilise XUnit, j'ai décidé d'apporter l'assistant très utile Xunit.SkippableFact !

Par exemple :

[SkippableFact]
public void LoadTheMainPageAndCheckTitle()
{
    Skip.If(InDocker, "We are in Docker, y'all!");
    Browser.Navigate().GoToUrl(Server.RootUri);
    Assert.StartsWith("Hanselminutes Technology Podcast - Fresh Air and Fresh Perspectives for Developers", Browser.Title);
}

SkippableFact me permet de sauter des tests pour pratiquement n'importe quelle raison. Je pourrais aider si je suis dans Docker, comme je le fais ici. Ou, étant donné que Selenium Tests lancera une "OpenQA.Selenium.WebDriverException" lorsqu'il ne trouvera pas le pilote Web Selenium, je pourrais également le faire, en sautant car une exception spécifique a été détectée. Notez que cela signifie qu'il s'agit d'un SKIP et non d'un FAIL.

[SkippableFact(typeof(OpenQA.Selenium.WebDriverException))]
public void KevinScottTestThenGoHome()
{
   Browser.Navigate().GoToUrl(Server.RootUri + "/631/how-do-you-become-a-cto-with-microsofts-cto-kevin-scott");

   var headerSelector = By.TagName("h1");
   var link = Browser.FindElement(headerSelector);
   link.Click();
}

Les résultats ressemblent à ceci :

Total tests: 22. Passed: 18. Failed: 0. Skipped: 4.
Test Run Successful.
Test execution time: 8.7878 Seconds

Vous pouvez choisir d'ignorer les tests si un backend, une API tierce ou une base de données était en panne, mais vous vouliez toujours tester autant que possible. Je suis assez content des résultats !

Nouveau parrain ! Ne saisissez plus jamais de facture ! Avec DocSight OCR par ActivePDF, vous extrairez des données de factures, de bons de commande et d'autres documents à l'aide de la technologie de capture de données zonale. Réalisez la transformation numérique dès aujourd'hui !

Docker
  1. Exécuter PostgreSQL dans Docker, un guide rapide et pratique

  2. différence entre podman et docker.

  3. Comment exécuter une commande sur un conteneur Docker en cours d'exécution

  4. Installer Docker et WordPress sur Ubuntu

  5. Optimisation des tailles d'image Docker ASP.NET Core

Premiers pas avec .NET Core et Docker et le registre de conteneurs Microsoft

.NET Core et Docker

Création, exécution et test de .NET Core et ASP.NET Core 2.1 dans Docker sur un Raspberry Pi (ARM32)

.NET et Docker

Explorer ASP.NET Core avec Docker dans les conteneurs Linux et Windows

Déplacement d'un ASP.NET Core d'Azure App Service sur Windows vers Linux en testant d'abord dans WSL et Docker