Tes Unit Menulis untuk Kelas yang Mulai EXE Eksternal

9

Saya menulis kelas C # yang digunakan untuk memulai daftar EXE (bukan salah satu dari saya - EXE pihak ketiga yang harus saya jalankan) dan membuat mereka tetap berjalan (akan memeriksa sesekali untuk memastikan itu masih berjalan, dan mulai mereka jika tidak) .

Saya dapat menguji logika dasar menambahkan, menghapus, dll. Bagaimana cara Tes Unit bahwa pekerjaan sebenarnya menjaga EXEs akan berhasil?

Pikiran awal saya adalah memulai beberapa dummy EXE yang menutup sendiri setelah 1 detik, kemudian menggunakannya untuk menguji. Apakah itu di luar bidang Pengujian Unit?

MattW
sumber

Jawaban:

12

Pikiran awal saya adalah memulai beberapa dummy EXE yang menutup sendiri setelah 1 detik, kemudian menggunakannya untuk menguji. Apakah itu di luar bidang Pengujian Unit?

Apakah ini ujian yang bagus? Tentu, jadi buat itu. Apakah itu "Tes Unit" dalam arti sebenarnya dari kata itu? Saya rasa tidak, saya akan menyebutnya "pengujian sistem" atau sesuatu seperti itu, tetapi itu tidak membuat tes tersebut kurang berharga.

Doc Brown
sumber
9

Mengejeknya di tingkat yang lebih tinggi dari itu. Buat kelas proxy di sekitar Process.Start(), berpura-pura bahwa dalam tes dan periksa input.

public interface IProcessProxy
{
     ProcessInfo Start(string application, string[] arguments);
}

public class ProcessProxy : IProcessProxy
{
    public ProcessInfo Start(string application, string[] arguments)
    {
        return Process.Start(application, arguments);
    }
}

// You could use a mocking framework for this, but for the purposes
// of this example ...
public class FakeProcessProxy : IProcessProxy
{
    private string _expectedApplication;
    private string[] _expectedArguments;
    private ProcessInfo response;

    public FakeProxy(string expectedApplication, string[] expectedArguments, ProcessInfo response)
    {
         _expectedApplication = expectedApplication;
         _expectedArguments = expectedArguments;
    }

    public ProcessInfo Start(string application, string[] arguments)
    {
         // compare input to expectations and throw exception if not matching
         return _response;
    }
}

// You can also use an IoC framework to inject your IProcessProxy, but I won't.
public class ClassUnderTest
{
    public ClassUnderTest(IProcessProxy proxy)
    {
        _proxy = proxy;
    }

    public ClassUnderTest() : this(new ProcessProxy())
    {
    }

    public void MethodUnderTest()
    {
        // Do stuff

        ProcessInfo process = _proxy.Start(@"C:\Program Files\App\App.exe", new[] { "arg1", "arg2" });
        process.WaitForExit();

        if (process.ExitCode == 0)
        {
            // Act on success
        }
        else
        {
            // Act on failure
        }
    }   
}

Di mana pun Anda perlu menggunakan ClassUnderTest dalam kode aplikasi, gunakan konstruktor default. Dalam pengujian Anda, berikan FakeProcessProxy ke konstruktor lain, menggunakan parameter Proxy Start yang diharapkan dan hasil tes Anda di konstruktor palsu itu.

pdr
sumber
4

Ketika benar - benar mengikuti filosofi unittesting (penekanan pada unit ), Anda tidak boleh membuat file-Exe, tetapi tes jika kelas Anda memanggil antarmuka untuk memijah dan memantau proses itu dengan benar. Bagaimanapun, Anda ingin menguji kelas Anda, bukan perpustakaan yang bertanggung jawab untuk proses penanganan.

Tetapi dari sudut pandang pragmatis, pendekatan Anda baik-baik saja, meskipun 1 detik tampaknya agak lama.

keppla
sumber
1

Saya melakukan sesuatu yang serupa, tetapi baru saja menelepon ping localhost. Menghemat kerumitan menempatkan executable di server build Anda

Ben
sumber