การเขียนการทดสอบหน่วยสำหรับชั้นเรียนที่เริ่มต้น EXE ภายนอก


9

ฉันเขียนคลาส C # ที่ใช้เพื่อเริ่มรายการ EXE (ไม่ใช่ของฉัน - EXE ของบุคคลที่สามที่ฉันต้องเรียกใช้) และให้พวกเขาทำงานต่อไป (จะตรวจสอบเป็นครั้งคราวเพื่อให้แน่ใจว่ามันยังคงทำงานอยู่และเริ่มต้นหากไม่ได้) .

ฉันสามารถทดสอบตรรกะพื้นฐานของการเพิ่มการเอาออกและอื่น ๆ ได้ ฉันจะทดสอบหน่วยได้อย่างไรว่างานที่แท้จริงในการดูแล EXEs จะทำงานได้อย่างไร

ความคิดเริ่มต้นของฉันคือการเริ่มต้นหุ่นจำลอง EXE ที่ปิดตัวเองหลังจาก 1 วินาทีจากนั้นใช้เพื่อทดสอบ นั่นไม่ใช่ขอบเขตของการทดสอบหน่วยหรือไม่

คำตอบ:


12

ความคิดเริ่มต้นของฉันคือการเริ่มต้นหุ่นจำลอง EXE ที่ปิดตัวเองหลังจาก 1 วินาทีจากนั้นใช้เพื่อทดสอบ นั่นไม่ใช่ขอบเขตของการทดสอบหน่วยหรือไม่

นี่เป็นการทดสอบที่ดีหรือไม่? แน่นอนว่าสร้างมันขึ้นมา มันคือ "การทดสอบหน่วย" ในความหมายที่แท้จริงของคำว่า? ฉันไม่คิดอย่างนั้นฉันจะเรียกสิ่งนี้ว่า "การทดสอบระบบ" หรืออะไรทำนองนั้น แต่นั่นไม่ได้ทำให้การทดสอบมีค่าน้อยลง


9

เยาะเย้ยมันในระดับสูงกว่านั้น สร้างคลาสพร็อกซีโดยรอบProcess.Start()ปลอมที่อยู่ในการทดสอบและตรวจสอบอินพุต

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
        }
    }   
}

เมื่อใดก็ตามที่คุณต้องการใช้ ClassUnderTest ในรหัสแอปพลิเคชันให้ใช้ตัวสร้างเริ่มต้น ในการทดสอบของคุณให้ส่ง FakeProcessProxy ไปยังตัวสร้างอื่นโดยใช้พารามิเตอร์ Proxy Start ที่คุณคาดไว้และผลการทดสอบของคุณใน Constructor ของปลอม


4

เมื่อปฏิบัติตามปรัชญาของการไม่ยึดถืออย่างเคร่งครัด (เน้นหน่วย ) คุณไม่ควรสร้างไฟล์ exe แต่ควรทดสอบว่าคลาสของคุณเรียกใช้อินเทอร์เฟซเพื่อวางไข่และตรวจสอบกระบวนการนั้นอย่างถูกต้องหรือไม่ ท้ายที่สุดคุณต้องการทดสอบชั้นเรียนของคุณไม่ใช่ห้องสมุดที่รับผิดชอบการจัดการกระบวนการ

แต่จากมุมมองที่เป็นจริงแนวทางของคุณก็ใช้ได้แม้ว่า 1 วินาทีนั้นดูเหมือนจะยาวไปหน่อย


1

ผมทำอะไรที่คล้ายกัน ping localhostแต่เรียกว่าเพียงแค่ ช่วยลดความยุ่งยากในการติดตั้งโปรแกรมบนเซิร์ฟเวอร์สร้าง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.