2016-09-02 6 views
2

Ich habe eine ASP.NET-Web-API-Anwendung mit Unterstützung von Azure Web Job mit Funktionen, die von Nachrichten ausgelöst werden, die von den API-Controllern zu einer Speicherwarteschlange hinzugefügt wurden. Testen der Web-API ist einfach genug mit OWIN aber wie teste ich die Web-Jobs?Wie Integrationstest Azure Web Jobs?

Leite ich eine Konsolen-App im Arbeitsspeicher im Speicher ab? Führen Sie die Funktion direkt aus (das wäre aber kein richtiger Integrationstest)? Es ist ein kontinuierlicher Job, so dass die App nicht beendet wird. Zu allem Überfluss sind Azure Web Job-Funktionen ungültig, so dass keine Ausgabe zum Bestätigen erfolgt.

+1

Von Code Perspektive Funktionalitätstests ich sagen würde, ist, Sie können die Funktionseinheit Test innerhalb der WebJob void-Methode, die sowieso ein Eintrag Punkt, wo Sie nicht viel Code haben sollten. Wenn Sie wirklich einen Integrationstest durchführen möchten, fügen Sie eine Bedingung in Ihrem Code hinzu, um die Antwort auf einen Datenspeicher auszugeben, der eventuell aktiviert werden kann. Natürlich ist dies nur für Testnachrichten. – TusharJ

Antwort

2

Während @ Boris-lipschitz ist richtig, wenn Ihr Job kontinuierlich ist (wie op sagt es ist), können Sie nichts nach dem Aufruf Host. RunAndBlock().

Wenn Sie den Host jedoch in einem separaten Thread ausführen, können Sie mit dem Test wie gewünscht fortfahren. Allerdings müssen Sie am Ende des Tests eine Art Abfrage durchführen, um zu wissen, wann der Job ausgeführt wurde.

Beispiel
Funktion (eine einfache Kopie von einem Klecks zum anderen, erstellt von Blob ausgelöst) getestet werden:

public void CopyBlob(
    [BlobTrigger("input/{name}")] TextReader input, 
    [Blob("output/{name}")] out string output) 
{ 
    output = input.ReadToEnd(); 
} 

Testfunktion:

[Test] 
public void CopyBlobTest() 
{ 
    var blobClient = GetBlobClient("UseDevelopmentStorage=true;"); 

    //Start host in separate thread 
    var thread = new Thread(() => 
    { 
     Thread.CurrentThread.IsBackground = true; 
     var host = new JobHost(); 
     host.RunAndBlock(); 
    }); 

    thread.Start(); 

    //Trigger job by writing some content to a blob 
    using (var stream = new MemoryStream()) 
    using (var stringWriter = new StreamWriter(stream)) 
    { 
     stringWriter.Write("TestContent"); 
     stringWriter.Flush(); 

     stream.Seek(0, SeekOrigin.Begin); 

     blobClient.UploadStream("input", "blobName", stream); 
    } 

    //Check every second for up to 20 seconds, to see if blob have been created in output and assert content if it has 
    var maxTries = 20; 
    while (maxTries-- > 0) 
    { 
     if (!blobClient.Exists("output", "blobName")) 
     { 
      Thread.Sleep(1000); 
      continue; 
     } 

     using (var stream = blobClient.OpenRead("output", "blobName")) 
     using (var streamReader = new StreamReader(stream)) 
     { 
      Assert.AreEqual("TestContent", streamReader.ReadToEnd()); 
     } 
     break; 
    } 
} 
3

Die Konsolenanwendung muss nicht im Speicher ausgeführt werden. Sie können JobHost im Speicher Ihres Integrationstests ausführen.

var host = new JobHost(); 

Sie könnten host.Call() oder host.RunAndBlock() verwenden. Sie müssen auf das Azure-Speicherkonto verweisen, da Webjobs in localhost nicht unterstützt werden. Es hängt davon ab, was Ihre Funktion macht, aber Sie könnten eine Nachricht manuell zu einer Warteschlange hinzufügen, einen Blob oder was auch immer hinzufügen. Sie könnten durch Abfragen des Speichers, wo Ihr Web-Job Ergebnis ausgeführt, etc.

0

Ich konnte das sehr einfach simulieren, indem ich einfach folgendes tue und es scheint so zu sein rk gut für mich:

private JobHost _webJob; 

[OneTimeSetUp] 
public void StartupFixture() 
{ 
    _webJob = Program.GetHost(); 
    _webJob.Start(); 
} 
[OneTimeTearDown] 
public void TearDownFixture() 
{ 
    _webJob?.Stop(); 
} 

Wo der WebJob-Code wie folgt aussieht:

public class Program 
{ 
    public static void Main() 
    { 
     var host = GetHost(); 
     host.RunAndBlock(); 
    } 

    public static JobHost GetHost() 
    { 
     ... 
    } 
} 
Verwandte Themen