2016-09-02 30 views
2

私は、Azure Web JobをサポートするASP.NET Web APIアプリケーションを持っています。この機能は、APIのコントローラによってストレージキューに追加されたメッセージによってトリガされます。 Web APIのテストはOWINを使って十分に簡単ですが、どのようにWebジョブをテストしますか?Azure Webジョブの統合テスト方法

テストランナーのメモリにコンソールアプリケーションを実行していますか?関数を直接実行してください(これは適切な統合テストではありません)。それはアプリケーションが終了しないように継続的な仕事です。事態を悪化させるために、Azure Web Job機能は無効であるため、アサートする出力はありません。

+1

私が言うには、あなたはユニットテストをすることができますですとにかくエントリですWebJobのボイドメソッド内の関数あなたがたくさんのコードを持ってはならないことを指摘してください。実際に統合テストを行う場合は、コード内に条件を追加して、最終的にアサートできるデータストアへの応答を出力します。もちろんこれはテストメッセージのためのものです。 – TusharJ

答えて

2

@ boris-lipschitzは正しいですが、あなたの仕事が大雑把なとき(opと同じですが)、hostを呼び出してから何もすることはできません。 RunAndBlock()。

ただし、ホストを別のスレッドで実行する場合は、必要に応じてテストを続行できます。ただし、テストの最後に、ジョブがいつ実行されたかを知るために何らかのポーリングを行う必要があります。


機能試験する(作成ブロブによってトリガ別のBLOBからの単純なコピー):

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

テスト機能:

[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

コンソールアプリケーションをメモリ上で実行する必要はありません。 JobHostは、統合テストのメモリ内で実行できます。

var host = new JobHost(); 

host.Call()またはhost.RunAndBlock()を使用できます。 Webjobはlocalhostではサポートされていないため、Azureストレージアカウントをポイントする必要があります。 それはあなたの機能が何をしているかによって異なりますが、キューにメッセージを手動で追加したり、ブロブなどを追加することができます。

0

私はこれを実際に簡単に以下のようにシミュレートすることができました。私のためにRKの罰金:WebJobコードがどのように見える

private JobHost _webJob; 

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

:コードの機能テストの観点から

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

    public static JobHost GetHost() 
    { 
     ... 
    } 
} 
関連する問題