ฉันจะทดสอบโปรแกรมอ่านไฟล์ได้อย่างไร


19

ฉันกำลังทำงานในโครงการที่มีรูปแบบไฟล์ไม่กี่รูปแบบ รูปแบบบางรูปแบบถูกระบุโดย. xsds รูปแบบอื่น ๆ โดยใช้เอกสารประกอบในเว็บไซต์ที่เกี่ยวข้องและบางรูปแบบเป็นรูปแบบภายในที่กำหนดเองที่ไม่มีเอกสารประกอบ Mwahahahaha

มีปัญหาอะไร?

ฉันต้องการทดสอบตัวอ่านไฟล์ของฉัน แต่ฉันไม่แน่ใจว่าจะทำสิ่งนี้ได้อย่างไร การไหลของแอพลิเคชันเป็นเช่นนี้:

file.___  ===> read by FileReader.java ===> which creates a Model object

ที่FileReaderอินเตอร์เฟซอยู่

public interface FileReader {
    public Model read(String filename);
}

กระบวนการModelมีจำนวนของคุณสมบัติที่บรรจุเมื่ออ่านไฟล์ มันดูเหมือนอะไร

public class Model {
    List<String> as;
    List<String> bs;
    boolean isAPain = true;
    // ...
}

ฉันลองทำอะไร

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

สิ่งนี้มีปัญหาเล็กน้อยแม้ว่า:

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

มีวิธีที่ดีกว่าในการทำเช่นนี้?

แก้ไข: เปลี่ยนหน่วยเป็นการรวมเนื่องจากนั่นคือสิ่งที่ฉันหมายถึงจริง

แก้ไข 2: นี่คือตัวอย่างของกรณีขอบที่ฉันกล่าวถึง

แต่ละไฟล์แสดงกราฟที่ประกอบด้วยจุดยอดและขอบ จุดยอดและขอบเหล่านี้สามารถติดได้หลายวิธีดังนั้น:

v1 -- e1 --> v2 <-- e2 -- v3

แตกต่างจาก

v1 -- e1 --> v2 -- e2 --> v3

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


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

@rwong ฉันได้เพิ่มตัวอย่าง แต่ฉันไม่แน่ใจว่ามันให้ความคิดกับคุณหรือไม่ ฉันเดาว่าปัญหาของฉันเป็นปัญหาทั่วไปที่มีตัวพิมพ์ขอบเช่น ฉันเคยพลาดบ้างไหม? แม้ว่าการทดสอบด้วยข้อมูลจะดูน่าสนใจ ขอบคุณ!
sdasdadas

7
นอกจากนี้ฉันเพิ่งสังเกตเห็นนี้ แต่กรณีขอบของฉันแท้จริงเป็นกรณีขอบ
sdasdadas

1
ทำไมไม่ทดสอบไฟล์งานฝีมือด้วยมือจากนั้นก็จะทำงานกับไฟล์เดิมเสมอ
Bobson

@ Bobson มันแย่กว่าการใช้ generator ในกรณีนี้ฉันอาจพลาดกรณีที่ขอบ (เช่นฉันอาจหายไปตอนนี้) แต่ฉันอาจแนะนำข้อผิดพลาดในการพิมพ์ของฉัน และด้วยไฟล์ขนาดใหญ่การสร้างด้วยตัวเองจะใช้เวลาพอสมควร
sdasdadas

คำตอบ:


19

ก่อนอื่นให้พูดถึงเป้าหมายของคุณ:

  • แน่นอนคุณไม่ต้องการทดสอบ "รูปแบบไฟล์" - คุณต้องการทดสอบFileReaderการใช้งานที่แตกต่างกัน

  • คุณต้องการค้นหาข้อผิดพลาดหลายประเภทให้ได้มากที่สุดโดยการทดสอบอัตโนมัติ

ในการบรรลุเป้าหมายนั้นอย่างเต็มรูปแบบ IMHO คุณต้องรวมกลยุทธ์ที่แตกต่าง:

  • ก่อนการทดสอบหน่วยจริง: FileReaderการใช้งานของคุณจะประกอบด้วยชิ้นส่วนและฟังก์ชั่นต่าง ๆ มากมาย เขียนการทดสอบขนาดเล็กซึ่งทดสอบแต่ละอย่างแยก ออกแบบฟังก์ชั่นของคุณในแบบที่พวกเขาไม่จำเป็นต้องอ่านข้อมูลจากไฟล์ การทดสอบประเภทนี้จะช่วยให้คุณทดสอบเคสส่วนใหญ่ของคุณได้
  • ไฟล์ที่สองสร้างขึ้น: นั่นคือสิ่งที่ฉันจะเรียกว่าการทดสอบการรวม ไฟล์ดังกล่าวจะช่วยให้คุณติดตามความล้มเหลวที่แตกต่างจากจุดที่ 1 ตัวอย่างเช่นการรวมกันของพารามิเตอร์เฉพาะข้อผิดพลาดในการเข้าถึงไฟล์ ฯลฯ เพื่อสร้างกรณีทดสอบที่ดีมันจะเป็นประโยชน์ในการเรียนรู้เกี่ยวกับเทคนิคคลาสสิคเช่นการจัดกลุ่มกรณีทดสอบ คลาสเทียบเท่าหรือการทดสอบค่าขอบเขต รับสำเนาของหนังสือเล่มนี้โดย Glenford Myersเพื่อเรียนรู้เพิ่มเติมเกี่ยวกับเรื่องนี้ บทความวิกิพีเดียเกี่ยวกับการทดสอบซอฟต์แวร์ที่เป็นทรัพยากรที่ดีเกินไป
  • สามลองรับข้อมูลในโลกแห่งความจริง: มันยากที่จะตรวจสอบว่าไฟล์เหล่านี้ได้รับการประเมินอย่างถูกต้องโดยFileReaders ของคุณแต่มันอาจคุ้มค่าที่จะทำเช่นนี้เพราะมันมักจะพบข้อบกพร่องที่ไม่เปิดเผยโดยสองกลยุทธ์แรก บางคนอาจเรียกสิ่งนี้ว่า "การทดสอบการรวม" คนอื่น ๆ ชอบ "การทดสอบการยอมรับ" แต่ในความเป็นจริงแล้วคำศัพท์ไม่สำคัญ

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

นอกเหนือจากนั้นคุณควรตรวจสอบให้แน่ใจFileReaderว่าไม่ได้ปิดบังข้อผิดพลาดใด ๆ เมื่ออ่านข้อมูล - สร้างการตรวจสอบ / การยืนยันที่สร้างขึ้น, การโยนข้อยกเว้นเมื่อมีสิ่งผิดปกติเกิดขึ้นภายใน ฯลฯ แม้ว่าคุณจะไม่มีไฟล์ทดสอบที่ชัดเจนหรือกรณีทดสอบสำหรับสถานการณ์ที่ไม่คาดคิด


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