การทดสอบหน่วยและฐานข้อมูล: ฉันจะเชื่อมต่อกับฐานข้อมูล ณ จุดใด?


37

มีคำตอบให้กับคำถามเกี่ยวกับวิธีการเรียนการทดสอบที่เชื่อมต่อกับฐานข้อมูลเช่นมี"เรียนให้บริการทดสอบควรเชื่อมต่อ ..."และ"การทดสอบหน่วย - ฐานข้อมูลแอปพลิเคคู่"

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

ดังนั้นที่จุดฉันต้องพูดว่า "ที่นี่ฉันดึงข้อมูลจากฐานข้อมูลและฉันจะไม่เขียนหน่วยทดสอบสำหรับรหัสชิ้นนี้"?

ในคำอื่น ๆ : บางแห่งในรหัสในบางชั้นฉันต้องโทรsqlDB.connect()หรือสิ่งที่คล้ายกัน ฉันจะทดสอบคลาสนี้ได้อย่างไร

และมันเป็นรหัสเดียวกันกับที่ต้องจัดการกับ GUI หรือระบบไฟล์หรือไม่?


ฉันต้องการทดสอบหน่วย การทดสอบประเภทอื่นใดไม่เกี่ยวข้องกับคำถามของฉัน ฉันรู้ว่าฉันจะทดสอบเพียงชั้นเดียวเท่านั้น (ฉันเห็นด้วยกับคุณ Kilian) ตอนนี้บางคลาสต้องเชื่อมต่อกับฐานข้อมูล ถ้าฉันต้องการทดสอบคลาสนี้และถามว่า "ฉันจะทำแบบนี้ได้อย่างไร" หลายคนพูดว่า: "Use Dependency Injection!" แต่นั่นทำให้ปัญหาเปลี่ยนไปอีกระดับหนึ่งเท่านั้นใช่ไหม ดังนั้นฉันถามฉันจะทดสอบชั้นเรียนได้อย่างไรจริง ๆ สร้างการเชื่อมต่อจริง ๆ

คำถามโบนัส: บางคำตอบที่นี่ต้มลงไปที่ "ใช้วัตถุจำลอง!" นั่นหมายความว่าอย่างไร? ฉันเยาะเย้ยชั้นเรียนที่ชั้นเรียนภายใต้การทดสอบขึ้นอยู่กับ ฉันจะเยาะเย้ยการทดสอบในชั้นเรียนตอนนี้และทดสอบการเยาะเย้ย (ซึ่งใกล้เคียงกับแนวคิดของการใช้เทมเพลตวิธีดูด้านล่าง)?


เป็นการเชื่อมต่อฐานข้อมูลที่คุณกำลังทดสอบอยู่หรือไม่? การสร้างชั่วคราวในฐานข้อมูลหน่วยความจำ (เช่นดาร์บี้ ) จะยอมรับได้หรือไม่

@MichaelT ฉันยังต้องแทนที่ชั่วคราวในฐานข้อมูลหน่วยความจำด้วยฐานข้อมูลจริง ที่ไหน? เมื่อ? มันเป็นวิธีการทดสอบหน่วย? หรือว่าตกลงที่จะไม่ทดสอบหน่วยรหัสนี้?
TobiMcNamobi

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

2
@KilianFoth ที่เกี่ยวข้องกับสภาพแวดล้อมในการทำงานและบทบาทของพนักงานอย่างแท้จริง มันไม่มีอะไรเกี่ยวข้องกับคำถามจริงๆ ถ้าไม่มีใครรับผิดชอบฐานข้อมูลล่ะ?
Reactgular

เฟรมเวิร์กการเยาะเย้ยบางอย่างช่วยให้คุณสามารถฉีดวัตถุจำลองให้เป็นอะไรก็ได้แม้แต่กับสมาชิกแบบส่วนตัวและแบบคงที่ สิ่งนี้ทำให้การทดสอบกับสิ่งต่าง ๆ เช่นการเชื่อมต่อฐานข้อมูลจำลองทำให้ง่ายขึ้นมาก Mockito + Powermock เป็นสิ่งที่เหมาะกับฉันในทุกวันนี้ (พวกเขาเป็น Java ไม่แน่ใจว่าคุณทำงานอะไรอยู่)
FrustratedWithFormsDesigner

คำตอบ:


21

จุดทดสอบหน่วยคือการทดสอบหนึ่งคลาส (อันที่จริงแล้วควรทดสอบวิธีหนึ่ง )

ซึ่งหมายความว่าเมื่อคุณทดสอบคลาสAคุณฉีดฐานข้อมูลทดสอบลงในนั้น - บางสิ่งที่เขียนด้วยตนเองหรือฐานข้อมูลในหน่วยความจำที่เร็วที่สุดไม่ว่าอะไรจะเกิดขึ้นก็ตาม

อย่างไรก็ตามหากคุณทดสอบคลาสBซึ่งเป็นไคลเอนต์AคุณมักจะจำลองAวัตถุทั้งหมดด้วยสิ่งอื่นซึ่งสันนิษฐานว่ามีบางสิ่งบางอย่างที่ทำงานในรูปแบบดั้งเดิมซึ่งตั้งโปรแกรมไว้ล่วงหน้าโดยไม่ต้องใช้Aวัตถุจริงและแน่นอนโดยไม่ใช้ข้อมูล base (เว้นแต่จะAผ่านการเชื่อมต่อฐานข้อมูลทั้งหมดกลับไปยังผู้โทร - แต่มันช่างน่ากลัวเหลือเกินที่ฉันไม่ต้องการคิดเกี่ยวกับมัน) ในทำนองเดียวกันเมื่อคุณเขียนการทดสอบหน่วยสำหรับชั้นเรียนCซึ่งเป็นไคลเอนต์ของBคุณจะเยาะเย้ยสิ่งที่ใช้บทบาทของBและลืมAไปโดยสิ้นเชิง

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


11

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

กุญแจสำคัญในที่นี้คือการทดสอบกับฐานข้อมูลชั่วคราวหรือทดสอบเฉพาะฐานข้อมูลและให้กระบวนการเริ่มต้นที่เบาที่สุดสำหรับการสร้างฐานข้อมูลทดสอบนั้น

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

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

อ้างอิงเพิ่มเติมบางส่วน

http://en.wikipedia.org/wiki/Test_fixture

http://phpunit.de/manual/3.7/en/database.html

http://book.cakephp.org/2.0/en/development/testing.html#fixtures


28
ฉันไม่เห็นด้วย. การทดสอบที่ต้องการการเชื่อมต่อฐานข้อมูลไม่ใช่การทดสอบหน่วยเนื่องจากการทดสอบโดยธรรมชาติจะมีผลข้างเคียง นั่นไม่ได้หมายความว่าคุณไม่สามารถเขียนการทดสอบอัตโนมัติได้ แต่การทดสอบดังกล่าวเป็นการนิยามการทดสอบการรวมการใช้พื้นที่ของระบบของคุณนอกเหนือจาก codebase ของคุณ
KeithS

5
โทรหาฉันคนพิถีพิถัน แต่ฉันเชื่อมั่นในหลักการว่าการทดสอบหน่วยไม่ควรดำเนินการใด ๆ ที่ทำให้ "sandbox" ของสภาพแวดล้อมการทดสอบรันไทม์ พวกเขาไม่ควรสัมผัสฐานข้อมูลระบบไฟล์ซ็อกเก็ตเครือข่าย ฯลฯ นี่คือเหตุผลหลายประการไม่น้อยกว่านั้นเป็นการพึ่งพาการทดสอบกับสถานะภายนอก อีกประการหนึ่งคือประสิทธิภาพ; ชุดทดสอบหน่วยของคุณควรทำงานได้อย่างรวดเร็วและเชื่อมต่อกับที่เก็บข้อมูลภายนอกเหล่านี้ทำการทดสอบช้าตามลำดับความสำคัญ ในการพัฒนาของฉันเองฉันใช้ mocks บางส่วนเพื่อทดสอบสิ่งต่าง ๆ เช่นที่เก็บของฉันและฉันก็สบายใจที่จะกำหนด "edge" ลงในกล่องทรายของฉัน
KeithS

2
@gbjbaanb - ฟังดูดีในตอนแรก แต่จากประสบการณ์ของฉันมันอันตรายมาก แม้แต่ในชุดการทดสอบและเฟรมเวิร์กที่ดีที่สุดรหัสการย้อนกลับธุรกรรมนี้อาจไม่ทำงาน หากนักวิ่งทดสอบล้มเหลวหรือถูกยกเลิกภายในการทดสอบหรือการทดสอบโยน SOE หรือ OOME กรณีที่ดีที่สุดคือคุณมีการเชื่อมต่อและการทำธุรกรรมใน DB ที่จะล็อคตารางที่คุณสัมผัสจนกว่าการเชื่อมต่อจะถูกทำลาย วิธีที่คุณป้องกันปัญหาสาเหตุนี้เช่นการใช้ SQLite เป็นแบบทดสอบ DB มีข้อเสียของตัวเองเช่นความจริงที่คุณไม่ได้จริงๆการออกกำลังกายจริง DB
KeithS

5
@ KeithS ฉันคิดว่าเรากำลังถกเถียงกันเรื่องอรรถศาสตร์ มันไม่เกี่ยวกับความหมายของการทดสอบหน่วยหรือการทดสอบการรวมคืออะไร ฉันใช้ส่วนควบเพื่อทดสอบรหัสขึ้นอยู่กับการเชื่อมต่อฐานข้อมูล หากเป็นการทดสอบการรวมระบบกว่าที่ฉันจะพอใจ ฉันจำเป็นต้องรู้ว่าการทดสอบผ่าน ฉันไม่สนใจเกี่ยวกับการพึ่งพาประสิทธิภาพหรือความเสี่ยง ฉันจะไม่รู้ว่ารหัสนั้นใช้งานได้หรือไม่เว้นแต่ว่าผ่านการทดสอบนั้น สำหรับการทดสอบส่วนใหญ่ไม่มีการพึ่งพา แต่สำหรับการทดสอบที่มีการอ้างอิงนั้นจะไม่สามารถแยกออกได้ มันง่ายที่จะบอกว่าพวกเขาควรจะเป็น แต่พวกเขาก็ไม่สามารถ
ซ้ำ

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

4

มีบางแห่งใน codebase ของคุณบรรทัดของรหัสที่ดำเนินการตามจริงของการเชื่อมต่อกับฐานข้อมูลระยะไกล บรรทัดของรหัสนี้คือ 9 ครั้งใน 10 การเรียกไปยังวิธีการ "ในตัว" ที่จัดทำโดยไลบรารีรันไทม์เฉพาะสำหรับภาษาและสภาพแวดล้อมของคุณ ดังนั้นจึงไม่ใช่รหัส "ของคุณ" ดังนั้นคุณจึงไม่จำเป็นต้องทดสอบ สำหรับวัตถุประสงค์ของการทดสอบหน่วยคุณสามารถวางใจได้ว่าการเรียกใช้เมธอดนี้จะทำงานได้อย่างถูกต้อง สิ่งที่คุณสามารถทำได้และควรยังคงทดสอบในชุดทดสอบหน่วยของคุณเป็นสิ่งที่ทำให้มั่นใจได้ว่าพารามิเตอร์ที่จะใช้สำหรับการโทรนี้คือสิ่งที่คุณคาดหวังว่าจะเป็นเช่นการทำให้แน่ใจว่าสตริงการเชื่อมต่อนั้นถูกต้องหรือคำสั่ง SQL หรือ ชื่อกระบวนงานที่เก็บไว้

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

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


ตอนนี้คุณจะยึดมั่นในสิ่งนี้ได้มากน้อยเพียงใดขึ้นอยู่กับกลยุทธ์ที่แน่นอนสำหรับการเชื่อมต่อและสืบค้นฐานข้อมูล ในหลายกรณีที่คุณต้องใช้กรอบการเข้าถึงข้อมูล "กระดูกเปล่า" เช่นวัตถุ SqlConnection และ SqlStatement ของ ADO.NET วิธีทั้งหมดที่พัฒนาขึ้นโดยคุณอาจประกอบด้วยการเรียกใช้วิธีการในตัวและรหัสอื่น ๆ ที่ขึ้นอยู่กับการ การเชื่อมต่อฐานข้อมูลและสิ่งที่ดีที่สุดที่คุณสามารถทำได้ในสถานการณ์นี้คือจำลองหน้าที่ทั้งหมดและไว้วางใจชุดทดสอบการรวมระบบของคุณ นอกจากนี้ยังขึ้นอยู่กับว่าคุณเต็มใจที่จะออกแบบคลาสของคุณเพื่อให้สามารถแทนที่บรรทัดรหัสเฉพาะสำหรับการทดสอบได้อย่างไร (เช่นข้อเสนอแนะของ Tobi เกี่ยวกับรูปแบบวิธีการของแม่แบบซึ่งเป็นสิ่งที่ดีเพราะช่วยให้ "mocks บางส่วน"

หากรูปแบบการเก็บข้อมูลของคุณอาศัยรหัสในชั้นข้อมูลของคุณ (เช่นทริกเกอร์ procs ที่เก็บไว้ ฯลฯ ) ก็ไม่มีวิธีอื่นใดที่จะเขียนโค้ดด้วยตัวคุณเองมากกว่าที่จะพัฒนาแบบทดสอบที่อาศัยอยู่ในชั้นข้อมูลหรือข้าม ขอบเขตระหว่างแอ็พพลิเคชันรันไทม์ของคุณและ DBMS คนเจ้าระเบียบจะบอกว่ารูปแบบนี้ด้วยเหตุผลนี้คือการหลีกเลี่ยงสิ่งที่ชอบออม ฉันไม่คิดว่าฉันจะไปไกลขนาดนั้น แม้ในยุคของการสืบค้นด้วยภาษาและการตรวจสอบคอมไพเลอร์ที่ขึ้นอยู่กับโดเมนฉันเห็นค่าในการล็อคฐานข้อมูลลงไปจนถึงการดำเนินการที่เปิดเผยผ่านขั้นตอนการจัดเก็บเท่านั้นและแน่นอนว่าขั้นตอนการจัดเก็บนั้นจะต้องตรวจสอบโดยอัตโนมัติ การทดสอบ แต่การทดสอบดังกล่าวไม่ใช่การทดสอบหน่วย พวกเขารวม การทดสอบ

หากคุณมีปัญหากับความแตกต่างนี้มักจะขึ้นอยู่กับความสำคัญสูงที่ครอบคลุม "รหัสครอบคลุม" aka "ครอบคลุมการทดสอบหน่วย" คุณต้องการให้แน่ใจว่าทุกบรรทัดของรหัสของคุณครอบคลุมโดยการทดสอบหน่วย เป้าหมายอันสูงส่งบนใบหน้าของมัน แต่ฉันบอกว่า hogwash; ความคิดนั้นให้ตัวเองต่อต้านรูปแบบที่ยืดออกไปไกลเกินกว่ากรณีเฉพาะเช่นการเขียนการทดสอบที่ไม่มีการตรวจสอบที่ดำเนินการ แต่ไม่ได้ออกกำลังกายรหัสของคุณ การสิ้นสุดการใช้งานประเภทเหล่านี้เพียงเพื่อผลประโยชน์ของหมายเลขความคุ้มครองจะเป็นอันตรายมากกว่าการผ่อนคลายความครอบคลุมขั้นต่ำของคุณ หากคุณต้องการให้แน่ใจว่าทุก codebase ของคุณถูกดำเนินการโดยการทดสอบอัตโนมัติบางอย่างนั่นก็เป็นเรื่องง่าย เมื่อคำนวณการครอบคลุมโค้ดคอมพิวเตอร์ให้รวมการทดสอบการรวมเข้าด้วยกัน คุณสามารถก้าวต่อไปอีกขั้นหนึ่งและแยกการทดสอบ "Itino" ที่ขัดแย้งกันเหล่านี้ ("Integration in name only") และระหว่างชุดทดสอบหน่วยของคุณกับหมวดหมู่ย่อยของการทดสอบการรวมกลุ่ม (ซึ่งควรจะทำงานได้อย่างรวดเร็วพอสมควร) ใกล้กับความคุ้มครองเต็มรูปแบบ


2

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

ความหมายกันมีเหตุผลมากมายว่าทำไมสิ่งนี้มีประโยชน์:

  • การทดสอบจะดำเนินการตามลำดับความสำคัญเร็วกว่า
  • ลูปข้อเสนอแนะกลายเป็นทันที (<1 ข้อเสนอแนะสำหรับ TDD เป็นตัวอย่าง)
  • การทดสอบสามารถทำงานแบบขนานสำหรับระบบสร้าง / ปรับใช้
  • การทดสอบไม่จำเป็นต้องใช้ฐานข้อมูล (ทำให้การสร้างง่ายขึ้นหรือเร็วขึ้นอย่างน้อย)

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

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

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

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

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

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

คิดว่าการทดสอบทั้งสามประเภทเป็นปิรามิด คุณต้องมีการทดสอบหน่วยจำนวนมากเพื่อรองรับทุกอย่างจากนั้นจึงเริ่มจากที่นั่น


1

รูปแบบวิธีการเทมเพลตอาจช่วยได้

คุณตัดการเรียกไปยังฐานข้อมูลด้วยprotectedวิธีการ ในการทดสอบคลาสนี้คุณจะทดสอบวัตถุปลอมซึ่งสืบทอดมาจากคลาส connetion ฐานข้อมูลจริงและแทนที่วิธีที่ได้รับการป้องกัน

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


1
ในกรณีที่คุณสงสัยว่าทำไมฉันจึงตอบคำถามของตัวเอง: ใช่นี่อาจเป็นคำตอบ แต่ฉันก็ไม่แน่ใจว่ามันถูกหรือไม่
TobiMcNamobi

-1

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

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