GNU/Linux >> LINUX-Kenntnisse >  >> Panels >> Docker

Erkennen, dass eine .NET Core-App in einem Docker-Container ausgeführt wird, und SkipableFacts in XUnit

Ich habe meine Podcast-Site auf ASP.NET Core 2.1 umgestellt und sie in einem Docker ausgeführt Container. Nehmen Sie sich einen Moment Zeit und sehen Sie sich einige der Blog-Posts an, denn ich blogge, während ich lerne.

Ich habe Unit-Tests sowie Selenium-Tests hinzugefügt, die auch mit dem XUnit Unit Test Runner ausgeführt werden. Ich möchte jedoch nicht, dass diese Selenium-Tests, die Google Chrome automatisieren, im Kontext von Docker ausgeführt werden.

Ich habe versucht, eine Umgebungsvariable wie folgt in meine Docker-Datei einzufügen:

ENV INDOCKER=1

Ich dachte, ich würde nach dieser Variablen suchen und Tests bedingt überspringen. Einfach, oder? Nun, ich beschloss, tatsächlich zu LESEN die Dockerfiles, die meine ASP.NET Core 2.1-App verwendet. Denken Sie daran, Dockerfiles (und die daraus resultierenden Bilder) sind geschichtet und mit allem, was mit .NET zu tun hat, Open Source.

Wenn ich mir meine eigenen Ebenen ansehe und die Quelle auf Github erkunde, sehe ich, dass ich verwende:

  • microsoft/dotnet:2.1-aspnetcore-runtime auf Alpine – .NET Core und ASP.NET Core
    • Dort sehe ich, dass sie "ASPNETCORE_VERSION" als Umgebungsvariable setzen, was nützlich zu wissen ist.
      ENV ASPNETCORE_VERSION 2.1.1
  • microsoft/dotnet:2.1-runtime-deps-alpine3.7 – Notwendige Abhängigkeiten für .NET Core
    • Ich kann sehen, dass es auf Port 80 lauscht, aber es setzt auch eine nützliche Umgebungsvariable!
      ENV DOTNET_RUNNING_IN_CONTAINER=true

Schön, also muss ich nichts einstellen, um zu wissen, dass ich .NET in einem Container ausführe! Ich hätte davon nichts gewusst, wenn ich mir nicht 15 Minuten Zeit genommen und meinen Stack erkundet/behauptet/bestätigt hätte. Nur weil ich Docker-Container ausführe, heißt das nicht, dass es nicht sinnvoll ist, sich die Zeit zu nehmen, zu WISSEN, was ich ausführe! Bestätigen Sie Ihre Annahmen und all das, richtig?

Ich habe meinen Tests einen kleinen Helfer hinzugefügt:

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

Da ich XUnit verwende, habe ich mich entschieden, den sehr nützlichen Helfer Xunit.SkippableFact!

einzubauen

Zum Beispiel:

[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);
}

Mit SkipableFact kann ich Tests aus praktisch jedem Grund überspringen. Ich könnte helfen, wenn ich in Docker bin, wie ich es hier tue. Da Selenium Tests eine „OpenQA.Selenium.WebDriverException“ auslösen, wenn es den Selenium Web Driver nicht finden kann, könnte ich dies auch tun und überspringen, weil eine bestimmte Ausnahme durch war. Beachten Sie, dass dies ein SKIP und kein FAIL ist.

[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();
}

Die Ergebnisse sehen so aus:

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

Sie können Tests überspringen, wenn ein Backend, eine API eines Drittanbieters oder eine DB ausgefallen ist, Sie aber trotzdem so viel wie möglich testen möchten. Ich bin ziemlich zufrieden mit den Ergebnissen!

Neuer Sponsor! Nie wieder eine Rechnung eingeben! Mit DocSight OCR von ActivePDF extrahieren Sie Daten aus Rechnungen, Rechnungen, Bestellungen und anderen Dokumenten mithilfe der zonalen Datenerfassungstechnologie. Erreichen Sie noch heute die digitale Transformation!

Docker
  1. PostgreSQL in Docker ausführen, eine schnelle und praktische Anleitung

  2. Unterschied zwischen Podman und Docker.

  3. So führen Sie einen Befehl in einem laufenden Docker-Container aus

  4. Installieren Sie Docker und WordPress auf Ubuntu

  5. Optimieren der Größen von ASP.NET Core Docker-Images

Erste Schritte mit .NET Core und Docker und der Microsoft Container Registry

.NET Core und Docker

Erstellen, Ausführen und Testen von .NET Core und ASP.NET Core 2.1 in Docker auf einem Raspberry Pi (ARM32)

.NET und Docker

Erkunden von ASP.NET Core mit Docker in Linux- und Windows-Containern

Verschieben eines ASP.NET Core von Azure App Service unter Windows zu Linux, indem zuerst in WSL und Docker getestet wird