รหัสการทดสอบหน่วยที่มีการพึ่งพาระบบไฟล์


138

ฉันกำลังเขียนองค์ประกอบที่ให้ไฟล์ ZIP ต้อง:

  1. แตกไฟล์
  2. ค้นหา dll ที่ระบุในไฟล์ที่คลายซิป
  3. โหลด dll นั้นผ่านการสะท้อนกลับและเรียกใช้วิธีการนั้น

ฉันต้องการทดสอบหน่วยส่วนนี้

ฉันอยากเขียนโค้ดที่เกี่ยวข้องโดยตรงกับระบบไฟล์:

void DoIt()
{
   Zip.Unzip(theZipFile, "C:\\foo\\Unzipped");
   System.IO.File myDll = File.Open("C:\\foo\\Unzipped\\SuperSecret.bar");
   myDll.InvokeSomeSpecialMethod();
}

แต่คนมักพูดว่า "อย่าเขียนการทดสอบหน่วยที่พึ่งพาระบบไฟล์ฐานข้อมูลเครือข่าย ฯลฯ "

ถ้าฉันจะเขียนมันด้วยวิธีทดสอบที่เป็นมิตรฉันคิดว่ามันจะเป็นแบบนี้:

void DoIt(IZipper zipper, IFileSystem fileSystem, IDllRunner runner)
{
   string path = zipper.Unzip(theZipFile);
   IFakeFile file = fileSystem.Open(path);
   runner.Run(file);
}

เย้! ตอนนี้มันทดสอบได้ ฉันสามารถป้อนทดสอบเป็นสองเท่า (mocks) เป็นวิธี DoIt แต่ราคาเท่าไหร่ ตอนนี้ฉันต้องกำหนด 3 อินเตอร์เฟสใหม่เพื่อให้สามารถทดสอบได้ และฉันกำลังทดสอบอะไร ฉันกำลังทดสอบว่าฟังก์ชั่น DoIt ของฉันโต้ตอบกับการขึ้นต่อกันของมันอย่างเหมาะสม ไม่ได้ทดสอบว่าซิปไฟล์ถูกคลายซิปอย่างถูกต้อง ฯลฯ

ไม่รู้สึกว่าฉันกำลังทดสอบฟังก์ชั่นอีกต่อไป รู้สึกเหมือนฉันกำลังทดสอบการโต้ตอบในชั้นเรียน

คำถามของฉันคือ : หน่วยทดสอบสิ่งที่ขึ้นอยู่กับระบบไฟล์คืออะไร

แก้ไขฉันใช้. NET แต่แนวคิดสามารถใช้ Java หรือรหัสพื้นเมืองได้


8
ผู้คนพูดว่าอย่าเขียนระบบไฟล์ในการทดสอบหน่วยเพราะถ้าคุณอยากจะเขียนระบบไฟล์คุณไม่เข้าใจว่าอะไรเป็นการทดสอบหน่วย การทดสอบหน่วยมักจะโต้ตอบกับวัตถุจริงเดียว(หน่วยที่อยู่ภายใต้การทดสอบ) และการอ้างอิงอื่น ๆ ทั้งหมดจะเยาะเย้ยและผ่านเข้ามาในชั้นเรียนการทดสอบนั้นประกอบด้วยวิธีการทดสอบที่ตรวจสอบเส้นทางตรรกะผ่านวิธีการของวัตถุและเส้นทางตรรกะเท่านั้น หน่วยภายใต้การทดสอบ
Christopher Perry

1
ในสถานการณ์ของคุณส่วนเดียวที่ต้องมีการทดสอบหน่วยจะเป็นmyDll.InvokeSomeSpecialMethod();ที่ที่คุณจะตรวจสอบว่ามันทำงานอย่างถูกต้องทั้งในสถานการณ์ที่ประสบความสำเร็จและล้มเหลวดังนั้นฉันจะไม่ทดสอบหน่วยDoItแต่DllRunner.Runบอกว่าการทดสอบ UNIT ในทางที่ผิด การใช้ผิดประเภทที่ยอมรับได้และเนื่องจากเป็นการทดสอบการรวมกลุ่มที่ปลอมแปลงการทดสอบหน่วยกฎการทดสอบหน่วยปกติไม่จำเป็นต้องมีการใช้อย่างเคร่งครัด
MikeT

คำตอบ:


47

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

เป็นความคิดที่ดีที่จะchdir()เข้าไปในไดเรคทอรีชั่วคราวก่อนที่จะทำการทดสอบและchdir()กลับมาหลังจากนั้น


27
+1 อย่างไรก็ตามโปรดทราบว่าchdir()เป็นกระบวนการทั่วดังนั้นคุณอาจแบ่งความสามารถในการเรียกใช้การทดสอบของคุณในแบบคู่ขนานถ้ากรอบการทดสอบของคุณหรือรุ่นในอนาคตของการสนับสนุนนั้น

69

เย้! ตอนนี้มันทดสอบได้ ฉันสามารถป้อนทดสอบเป็นสองเท่า (mocks) เป็นวิธี DoIt แต่ราคาเท่าไหร่ ตอนนี้ฉันต้องกำหนด 3 อินเตอร์เฟสใหม่เพื่อให้สามารถทดสอบได้ และฉันกำลังทดสอบอะไร ฉันกำลังทดสอบว่าฟังก์ชั่น DoIt ของฉันโต้ตอบกับการขึ้นต่อกันของมันอย่างเหมาะสม ไม่ได้ทดสอบว่าซิปไฟล์ถูกคลายซิปอย่างถูกต้อง ฯลฯ

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


12
DoItฟังก์ชั่นที่ทดสอบได้ตามที่ระบุไว้ไม่จำเป็นต้องทำการทดสอบ ในฐานะผู้ถามอย่างถูกต้องชี้ให้เห็นว่าไม่มีความสำคัญเหลือให้ทดสอบ ตอนนี้ก็ถึงการดำเนินงานของIZipper, IFileSystemและIDllRunnerความต้องการการทดสอบ แต่พวกเขาเป็นสิ่งที่ดีที่ได้รับการเย้ยหยันออกสำหรับการทดสอบ!
เอียนโกลด์บาย

56

คำถามของคุณทำให้หนึ่งในส่วนที่ยากที่สุดของการทดสอบสำหรับนักพัฒนาเพิ่งเริ่มทำ:

"ฉันจะทดสอบอะไรดี

ตัวอย่างของคุณไม่น่าสนใจมากนักเพราะมันแค่เรียก API บางอย่างเข้าด้วยกันดังนั้นถ้าคุณเขียนการทดสอบหน่วยคุณก็จะลงเอยด้วยการยืนยันวิธีการที่ถูกเรียก การทดสอบเช่นนี้จะทำให้รายละเอียดการใช้งานของคุณใกล้เคียงกับการทดสอบ สิ่งนี้ไม่ดีเพราะตอนนี้คุณต้องเปลี่ยนการทดสอบทุกครั้งที่คุณเปลี่ยนรายละเอียดการใช้งานของวิธีการของคุณเพราะการเปลี่ยนแปลงรายละเอียดการใช้งานทำให้การทดสอบของคุณแตก!

การมีการทดสอบที่ไม่ดีนั้นเลวร้ายยิ่งกว่าการไม่มีการทดสอบเลย

ในตัวอย่างของคุณ:

void DoIt(IZipper zipper, IFileSystem fileSystem, IDllRunner runner)
{
   string path = zipper.Unzip(theZipFile);
   IFakeFile file = fileSystem.Open(path);
   runner.Run(file);
}

ในขณะที่คุณสามารถผ่านเป็น mocks ไม่มีเหตุผลในวิธีการทดสอบ หากคุณพยายามทดสอบหน่วยนี้อาจมีลักษณะดังนี้:

// Assuming that zipper, fileSystem, and runner are mocks
void testDoIt()
{
  // mock behavior of the mock objects
  when(zipper.Unzip(any(File.class)).thenReturn("some path");
  when(fileSystem.Open("some path")).thenReturn(mock(IFakeFile.class));

  // run the test
  someObject.DoIt(zipper, fileSystem, runner);

  // verify things were called
  verify(zipper).Unzip(any(File.class));
  verify(fileSystem).Open("some path"));
  verify(runner).Run(file);
}

ขอแสดงความยินดีโดยทั่วไปคุณคัดลอกรายละเอียดการติดตั้งDoIt()วิธีการของคุณไปใช้ในการทดสอบ มีความสุข

เมื่อคุณเขียนทดสอบคุณต้องการที่จะทดสอบอะไรและไม่อย่างไร ดูการทดสอบกล่องดำเพิ่มเติม

สิ่งที่เป็นชื่อของวิธีการของคุณ (หรืออย่างน้อยก็ควรจะเป็น) วิธีมีทุกรายละเอียดการดำเนินงานเล็ก ๆ น้อย ๆ ที่อาศัยอยู่ภายในวิธีการของคุณ การทดสอบที่ดีช่วยให้คุณสามารถสลับออกวิธีโดยไม่ทำลายสิ่ง

คิดแบบนี้ถามตัวเอง:

"ถ้าฉันเปลี่ยนรายละเอียดการใช้งานของวิธีนี้ (โดยไม่ต้องแก้ไขสัญญาสาธารณะ) มันจะทำลายการทดสอบของฉันหรือไม่"

ถ้าคำตอบคือใช่คุณกำลังทดสอบวิธีและไม่อะไร

ในการตอบคำถามเฉพาะของคุณเกี่ยวกับการทดสอบรหัสด้วยการขึ้นต่อกันของระบบไฟล์สมมติว่าคุณมีสิ่งที่น่าสนใจเกิดขึ้นกับไฟล์และคุณต้องการบันทึกเนื้อหาที่เข้ารหัส Base64 ของ a byte[]ไปยังไฟล์ คุณสามารถใช้สตรีมสำหรับสิ่งนี้เพื่อทดสอบว่าโค้ดของคุณทำในสิ่งที่ถูกต้องโดยไม่ต้องตรวจสอบวิธีการใช้งาน ตัวอย่างหนึ่งอาจเป็นดังนี้ (ใน Java):

interface StreamFactory {
    OutputStream outStream();
    InputStream inStream();
}

class Base64FileWriter {
    public void write(byte[] contents, StreamFactory streamFactory) {
        OutputStream outputStream = streamFactory.outStream();
        outputStream.write(Base64.encodeBase64(contents));
    }
}

@Test
public void save_shouldBase64EncodeContents() {
    OutputStream outputStream = new ByteArrayOutputStream();
    StreamFactory streamFactory = mock(StreamFactory.class);
    when(streamFactory.outStream()).thenReturn(outputStream);

    // Run the method under test
    Base64FileWriter fileWriter = new Base64FileWriter();
    fileWriter.write("Man".getBytes(), streamFactory);

    // Assert we saved the base64 encoded contents
    assertThat(outputStream.toString()).isEqualTo("TWFu");
}

การทดสอบใช้ByteArrayOutputStreamแต่ในการประยุกต์ใช้ (ใช้ฉีดพึ่งพา) เดอะ StreamFactory จริง (บางทีเรียกว่า FileStreamFactory) จะกลับมาFileOutputStreamจากและเขียนไปยังoutputStream()File

สิ่งที่น่าสนใจเกี่ยวกับwriteวิธีการที่นี่คือมันเขียนเนื้อหาออก Base64 ที่เข้ารหัสดังนั้นนั่นคือสิ่งที่เราทดสอบ สำหรับคุณDoIt()วิธีนี้จะได้รับการทดสอบอย่างเหมาะสมกับการทดสอบบูรณาการ


1
ฉันไม่แน่ใจว่าฉันเห็นด้วยกับข้อความของคุณที่นี่ คุณกำลังบอกว่าไม่จำเป็นต้องทดสอบหน่วยวิธีการนี้หรือไม่? ดังนั้นคุณโดยทั่วไปบอกว่า TDD ไม่ดี? ราวกับว่าคุณทำ TDD คุณจะไม่สามารถเขียนวิธีนี้ได้โดยไม่ต้องทำการทดสอบก่อน หรือคุณต้องพึ่งความรู้สึกที่วิธีการของคุณไม่ต้องการการทดสอบ? เหตุผลที่เฟรมเวิร์กการทดสอบหน่วยทั้งหมดรวมถึงคุณลักษณะ "ตรวจสอบ" ก็คือสามารถใช้งานได้ "สิ่งนี้ไม่ดีเพราะตอนนี้คุณต้องเปลี่ยนการทดสอบทุกครั้งที่คุณเปลี่ยนรายละเอียดการใช้งานของวิธีการของคุณ" ... ยินดีต้อนรับสู่โลกแห่งการทดสอบหน่วย
Ronnie

2
คุณควรทดสอบ CONTRACT ของเมธอดไม่ใช่การติดตั้ง หากคุณต้องเปลี่ยนการทดสอบของคุณทุกครั้งที่มีการเปลี่ยนแปลงการดำเนินการตามสัญญาคุณจะได้รับเวลาอันน่ากลัวในการรักษาฐานรหัสแอพและฐานรหัสทดสอบ
Christopher Perry

@ Ronnie สุ่มทดสอบการใช้หน่วยไม่เป็นประโยชน์ มีโครงการที่มีลักษณะแตกต่างกันอย่างกว้างขวางและการทดสอบหน่วยไม่มีประสิทธิภาพในทุกโครงการ เป็นตัวอย่างฉันกำลังทำงานในโครงการที่ 95% ของรหัสเกี่ยวกับผลข้างเคียง (หมายเหตุลักษณะผลข้างเคียง - หนักนี้ตามความต้องการมันมีความซับซ้อนที่สำคัญไม่ใช่ความบังเอิญเพราะมันรวบรวมข้อมูลจาก แหล่งข้อมูลที่เป็นรัฐที่หลากหลายและนำเสนอด้วยการจัดการที่น้อยมากดังนั้นจึงไม่มีเหตุผลใด ๆ ที่บริสุทธิ์) การทดสอบหน่วยไม่มีประสิทธิภาพที่นี่การทดสอบการรวมเป็น
Vicky Chijwani

ผลข้างเคียงควรถูกผลักไปที่ขอบของระบบของคุณพวกมันไม่ควรพันเข้าด้วยกันในเลเยอร์ ที่ขอบคุณจะทดสอบผลข้างเคียงซึ่งก็คือพฤติกรรม ทุกที่อื่นคุณควรลองใช้ฟังก์ชั่นที่บริสุทธิ์โดยไม่มีผลข้างเคียงซึ่งสามารถทดสอบได้ง่ายและให้เหตุผลได้ง่ายใช้ซ้ำและเขียนได้ง่าย
Christopher Perry

24

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

สิ่งที่ฉันทำในตอนนี้คือการทดสอบหน่วยของคุณจะทำเท่าที่จะทำได้ซึ่งอาจไม่ครอบคลุม 100% ที่จริงแล้วอาจมีเพียง 10% เท่านั้น ประเด็นก็คือการทดสอบหน่วยของคุณควรรวดเร็วและไม่มีการพึ่งพาภายนอก พวกเขาอาจทดสอบกรณีเช่น "วิธีนี้จะส่ง ArgumentNullException เมื่อคุณผ่านเป็นโมฆะสำหรับพารามิเตอร์นี้"

ฉันจะเพิ่มการทดสอบการรวม (โดยอัตโนมัติและอาจใช้กรอบการทดสอบหน่วยเดียวกัน) ที่สามารถมีการอ้างอิงภายนอกและการทดสอบแบบ end-to-end สถานการณ์เช่นนี้

เมื่อทำการวัดรหัสครอบคลุมฉันจะวัดทั้งหน่วยทดสอบและการรวมเข้าด้วยกัน


5
ใช่ฉันได้ยินคุณ มีโลกที่แปลกประหลาดนี้ที่คุณไปถึงจุดที่คุณแยกออกจากกันมากจนเหลือเพียงแค่การเรียกใช้วิธีการกับวัตถุนามธรรม ปุยโปร่งสบาย เมื่อคุณมาถึงจุดนี้มันไม่รู้สึกว่าคุณกำลังทดสอบอะไรจริง ๆ คุณแค่ทดสอบการโต้ตอบระหว่างคลาส
Judah Gabriel Himango

6
คำตอบนี้ถูกเข้าใจผิด การทดสอบหน่วยไม่เหมือนน้ำตาลที่เป็นน้ำตาล มันถูกอบเข้าไปในเค้ก เป็นส่วนหนึ่งของการเขียนรหัสของคุณ ... กิจกรรมการออกแบบ ดังนั้นคุณจะไม่ "ปนเปื้อน" รหัสของคุณด้วยสิ่งใดที่จะ "อำนวยความสะดวกในการทดสอบ" เพราะการทดสอบเป็นสิ่งที่อำนวยความสะดวกให้คุณเขียนรหัสของคุณ 99% ของเวลาการทดสอบที่ยากที่จะเขียนเพราะนักพัฒนาเขียนรหัสก่อนการทดสอบและสิ้นสุดที่เขียนความชั่วร้ายรหัส untestable
คริสเพอร์รี่

1
@ คริสโตเฟอร์: เพื่อขยายความคล้ายคลึงของคุณฉันไม่ต้องการให้เค้กของฉันคล้ายกับวานิลลาฝานเพื่อให้ฉันสามารถใช้น้ำตาลได้ สิ่งที่ฉันเรียกร้องคือลัทธิปฏิบัตินิยม
Kent Boogaart

1
@ คริสโตเฟอร์: ชีวภาพของคุณบอกว่ามันทั้งหมด: "ฉันเป็นคนกระตือรือร้น TDD" ในทางกลับกันฉันก็สามารถใช้งานได้จริง ฉันทำ TDD ในที่ที่เหมาะสมและไม่ใช่ที่ที่ไม่มี - ในคำตอบของฉันบอกว่าฉันไม่ได้ทำ TDD แม้ว่าคุณจะคิดว่ามันเป็นเช่นนั้น และไม่ว่าจะเป็น TDD หรือไม่ฉันจะไม่แนะนำความซับซ้อนจำนวนมากเพื่ออำนวยความสะดวกในการทดสอบ
Kent Boogaart

3
@ChristopherPerry คุณช่วยอธิบายวิธีแก้ปัญหาต้นฉบับของ OP ด้วยวิธี TDD ได้ไหม? ฉันพบสิ่งนี้ตลอดเวลา ฉันต้องเขียนฟังก์ชั่นที่มีวัตถุประสงค์เพียงอย่างเดียวคือการดำเนินการกับการพึ่งพาภายนอกเช่นในคำถามนี้ ดังนั้นแม้ในสถานการณ์การเขียนการทดสอบครั้งแรกการทดสอบนั้นจะเป็นอย่างไร
Dax Fohl

8

ไม่มีอะไรผิดปกติกับการกดปุ่มระบบไฟล์เพียงแค่พิจารณาว่าเป็นการทดสอบการรวมระบบมากกว่าการทดสอบหน่วย ฉันจะสลับเส้นทางฮาร์ดโค้ดด้วยเส้นทางสัมพัทธ์และสร้างโฟลเดอร์ย่อย TestData เพื่อเก็บรหัสไปรษณีย์สำหรับการทดสอบหน่วย

หากการทดสอบการรวมระบบของคุณใช้เวลานานเกินไปในการรันให้แยกการทดสอบนั้นออกเพื่อไม่ให้ทำงานบ่อยเท่าการทดสอบหน่วยด่วนของคุณ

ฉันเห็นด้วยบางครั้งฉันคิดว่าการทดสอบโดยใช้การโต้ตอบอาจทำให้เกิดการมีเพศสัมพันธ์มากเกินไปและมักจบลงด้วยการให้คุณค่าที่ไม่เพียงพอ คุณต้องการทดสอบการคลายไฟล์ที่นี่ไม่ใช่แค่ยืนยันว่าคุณกำลังโทรหาวิธีการที่ถูกต้อง


บ่อยครั้งที่พวกเขาวิ่งหนีมีความกังวลเล็กน้อย เราใช้เซิร์ฟเวอร์การรวมอย่างต่อเนื่องที่เรียกใช้พวกเขาโดยอัตโนมัติสำหรับเรา เราไม่สนใจว่าจะใช้เวลานานเท่าใด หาก "นานแค่ไหนในการทำงาน" ไม่ต้องกังวลมีเหตุผลใดที่จะต้องแยกแยะระหว่างการทดสอบหน่วยและการรวมเข้าด้วยกัน?
Judah Gabriel Himango

4
ไม่ได้จริงๆ แต่ถ้านักพัฒนาต้องการที่จะเรียกใช้ทุกหน่วยทดสอบในเครื่องมันเป็นเรื่องที่ดีที่มีวิธีง่าย ๆ ในการทำเช่นนั้น
JC

6

วิธีหนึ่งคือการเขียนวิธีคลายซิปเพื่อใช้ InputStreams จากนั้นการทดสอบหน่วยสามารถสร้าง InputStream จากอาร์เรย์ไบต์โดยใช้ ByteArrayInputStream เนื้อหาของอาร์เรย์ไบต์นั้นอาจเป็นค่าคงที่ในรหัสการทดสอบหน่วย


ตกลงดังนั้นที่ช่วยให้การฉีดกระแส ฉีดพึ่งพา / IOC วิธีการเกี่ยวกับส่วนของการคลายซิปสตรีมลงในไฟล์โหลด dll ในไฟล์เหล่านั้นและเรียกวิธีการใน dll นั้น
Judah Gabriel Himango

3

สิ่งนี้ดูเหมือนจะเป็นการทดสอบการรวมระบบมากขึ้นเนื่องจากคุณขึ้นอยู่กับรายละเอียดเฉพาะ (ระบบไฟล์) ที่สามารถเปลี่ยนแปลงได้ในทางทฤษฎี

ฉันจะนามธรรมรหัสที่เกี่ยวข้องกับระบบปฏิบัติการเป็นโมดูลของตัวเอง (ชั้นเรียนประกอบขวดทุกอย่าง) ในกรณีของคุณคุณต้องการโหลด DLL เฉพาะถ้าพบให้สร้างอินเทอร์เฟซ IDllLoader และคลาส DllLoader แอปของคุณได้รับ DLL จาก DllLoader โดยใช้อินเทอร์เฟซและทดสอบว่า .. คุณไม่ต้องรับผิดชอบรหัส unzip หลังจากนั้นใช่ไหม


2

สมมติว่า "การโต้ตอบของระบบไฟล์" ได้รับการทดสอบอย่างดีในกรอบงานสร้างวิธีการทำงานกับสตรีมและทดสอบสิ่งนี้ การเปิด FileStream และส่งผ่านไปยังเมธอดนั้นสามารถออกจากการทดสอบได้เนื่องจาก FileStream.Open ได้รับการทดสอบโดยผู้สร้างเฟรม


คุณและผู้เล่นมีข้อเสนอแนะเหมือนกัน: ทำให้โค้ดของฉันทำงานได้กับสตรีม วิธีการเกี่ยวกับการเกี่ยวกับการขยายไฟล์เนื้อหาเป็นไฟล์ dll เปิด dll ที่และเรียกฟังก์ชั่นในนั้น? คุณจะทำอะไรที่นั่น
Judah Gabriel Himango

3
@JudahHimango ชิ้นส่วนเหล่านั้นอาจไม่สามารถทดสอบได้ คุณไม่สามารถทดสอบทุกอย่างได้ สรุปส่วนประกอบที่ไม่สามารถทดสอบได้ลงในบล็อคการทำงานของตัวเองและสมมติว่าจะทำงานได้ เมื่อคุณเจอจุดบกพร่องด้วยวิธีการทำงานของบล็อกนี้ให้ทำการทดสอบและ voila การทดสอบหน่วยไม่ได้หมายความว่าคุณต้องทดสอบทุกอย่าง การครอบคลุมโค้ด 100% ไม่สมจริงในบางสถานการณ์
Zoran Pavlovic

1

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


1

สำหรับการทดสอบหน่วยฉันขอแนะนำให้คุณรวมไฟล์ทดสอบไว้ในโครงการ (ไฟล์ EAR หรือเทียบเท่า) จากนั้นใช้พา ธ สัมพัทธ์ในการทดสอบหน่วยเช่น "../testdata/testfile"

ตราบใดที่โครงการของคุณส่งออก / นำเข้าอย่างถูกต้องกว่าการทดสอบหน่วยของคุณควรใช้งานได้


0

อย่างที่คนอื่น ๆ ได้กล่าวไว้การทดสอบแบบบูรณาการครั้งแรกนั้นทำได้ดี การทดสอบครั้งที่สองจะทำเฉพาะสิ่งที่ฟังก์ชั่นควรทำจริงซึ่งก็คือการทดสอบหน่วยทั้งหมดที่ควรทำ

ดังที่แสดงตัวอย่างที่สองนั้นดูไม่มีจุดหมายเล็กน้อย แต่มันให้โอกาสแก่คุณในการทดสอบว่าฟังก์ชันตอบสนองต่อข้อผิดพลาดในขั้นตอนใด ๆ คุณไม่มีการตรวจสอบข้อผิดพลาดในตัวอย่าง แต่ในระบบจริงคุณอาจมีและการฉีดพึ่งพาจะช่วยให้คุณทดสอบการตอบสนองต่อข้อผิดพลาดใด ๆ จากนั้นค่าใช้จ่ายจะคุ้มค่า

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