คำถามติดแท็ก integration-tests

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

11
การทดสอบการรวม (ฐานข้อมูล) ไม่ดีหรือไม่?
บางคนยืนยันว่าการทดสอบการรวมเป็นสิ่งเลวและผิดทุกอย่างต้องผ่านการทดสอบหน่วยซึ่งหมายความว่าคุณต้องจำลองการอ้างอิง ตัวเลือกที่ด้วยเหตุผลต่าง ๆ ฉันไม่ชอบเสมอ ฉันพบว่าในบางกรณีการทดสอบหน่วยก็ไม่ได้พิสูจน์อะไรเลย ลองมาปรับใช้การใช้พื้นที่เก็บข้อมูล (เล็กน้อย, ไร้เดียงสา) ต่อไปนี้ (ใน PHP) เป็นตัวอย่าง: class ProductRepository { private $db; public function __construct(ConnectionInterface $db) { $this->db = $db; } public function findByKeyword($keyword) { // this might have a query builder, keyword processing, etc. - this is // a totally naive example just to …

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

8
วิธีการทดสอบหน่วยควรจะเขียนโดยไม่เยาะเย้ยอย่างกว้างขวาง?
ตามที่ผมเข้าใจจุดของการทดสอบหน่วยคือการทดสอบหน่วยของรหัสในการแยก หมายความว่า: พวกเขาไม่ควรทำลายโดยการเปลี่ยนแปลงรหัสที่ไม่เกี่ยวข้องใดๆ ใน codebase การทดสอบหน่วยเดียวควรทำลายข้อบกพร่องในหน่วยการทดสอบซึ่งตรงข้ามกับการทดสอบการรวม (ซึ่งอาจแบ่งเป็นฮีป) ทั้งหมดนี้แสดงถึงว่าควรมีการเยาะเย้ยจากภายนอกหน่วยทดสอบ และฉันหมายถึงการพึ่งพาภายนอกทั้งหมดไม่เพียง แต่ "เลเยอร์นอก" เช่นระบบเครือข่ายระบบไฟล์ฐานข้อมูล ฯลฯ นี้นำไปสู่ข้อสรุปเชิงตรรกะที่แทบทุกหน่วยทดสอบความต้องการที่จะเยาะเย้ย ในทางกลับกันการค้นหาอย่างรวดเร็วของ Google เกี่ยวกับการเยาะเย้ยเผยให้เห็นบทความมากมายที่อ้างว่า "การเยาะเย้ยเป็นกลิ่นรหัส" และส่วนใหญ่ควรหลีกเลี่ยง (แม้ว่าจะไม่สมบูรณ์) ตอนนี้สำหรับคำถาม การทดสอบหน่วยควรเขียนอย่างถูกต้องอย่างไร? เส้นแบ่งระหว่างพวกเขากับการทดสอบการรวมอยู่ตรงไหน? อัปเดต 1 โปรดพิจารณารหัสหลอกต่อไปนี้: class Person { constructor(calculator) {} calculate(a, b) { const sum = this.calculator.add(a, b); // do some other stuff with the `sum` } } การทดสอบที่ทดสอบPerson.calculateวิธีการโดยไม่มีการเยาะเย้ยการCalculatorพึ่งพา …

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

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

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

3
การทดสอบบูรณาการวิจารณ์การออกแบบอย่างไร
ฉันได้อ่านที่โพสต์บล็อกของ JB Rainsbergerเกี่ยวกับการทดสอบแบบบูรณาการและสงสัยว่าวิธีการทดสอบบูรณาการนั้นรุนแรงกว่ากับการออกแบบของเราหรือไม่ เราเขียนการทดสอบแบบบูรณาการมากขึ้นซึ่งใหญ่กว่าและไม่วิจารณ์การออกแบบของเราอย่างรุนแรงเช่นเดียวกับ microtests

3
การทดสอบการรวมหมายถึงการทดสอบหน่วยทั้งหมดซ้ำหรือไม่?
สมมติว่าฉันมีฟังก์ชั่น (เขียนใน Ruby แต่ทุกคนควรเข้าใจได้): def am_I_old_enough?(name = 'filip') person = Person::API.new(name) if person.male? return person.age > 21 else return person.age > 18 end end ในการทดสอบหน่วยฉันจะสร้างการทดสอบสี่แบบเพื่อให้ครอบคลุมทุกสถานการณ์ แต่ละคนจะใช้ล้อเลียนPerson::APIวัตถุที่มีวิธีการที่ค้างอยู่และmale?age ตอนนี้มันมาถึงการเขียนการทดสอบการรวม ฉันถือว่า Person :: API ไม่ควรถูกเยาะเย้ยอีกต่อไป ดังนั้นฉันจะสร้างกรณีทดสอบสี่ชุดให้เหมือนกัน แต่ไม่มีการจำลองวัตถุ Person :: API ถูกต้องไหม ถ้าใช่แล้วประเด็นของการเขียนการทดสอบหน่วยคืออะไรถ้าฉันสามารถเขียนการทดสอบการรวมซึ่งทำให้ฉันมีความมั่นใจมากขึ้น (ขณะที่ฉันทำงานกับวัตถุจริงไม่ใช่ stubs หรือ mocks)

9
มันสมเหตุสมผลหรือไม่ที่จะไม่เขียนการทดสอบหน่วยเพราะพวกเขามีแนวโน้มที่จะได้รับความเห็นในภายหลังหรือเพราะการทดสอบการรวมมีคุณค่ามากขึ้น?
ฉันกำลังถกหน่วย / บูรณาการทดสอบกับเพื่อนร่วมงานและเขาทำกรณีที่น่าสนใจกับการเขียนการทดสอบหน่วย ฉันเป็นผู้ทดสอบหน่วยใหญ่ (JUnit เป็นหลัก) ผู้เสนอ แต่ฉันสนใจที่จะรับฟังผู้อื่นในขณะที่เขาทำประเด็นที่น่าสนใจ เพื่อสรุปคะแนนของเขา: เมื่อมีการเปลี่ยนแปลงรหัสสำคัญ (ชุด POJO ใหม่การปรับโครงสร้างแอปพลิเคชันหลัก ฯลฯ ) การทดสอบหน่วยมักจะถูกใส่ความคิดเห็นแทนการทำใหม่ เวลาที่ใช้ในการทดสอบแบบบูรณาการที่ดีขึ้นนั้นครอบคลุมถึงกรณีการใช้งานซึ่งทำให้การทดสอบที่มีขอบเขตน้อยลงมีความสำคัญน้อยลง คิดเกี่ยวกับเรื่องนี้? ฉันยังคงทดสอบแบบหน่วย (ตามที่ฉันเห็นอย่างต่อเนื่องว่ามันสร้างโค้ดที่ได้รับการปรับปรุง) แม้ว่าการทดสอบการรวมจะมีค่าอย่างน้อยก็มีค่า

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

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

6
ฐานข้อมูลและการทดสอบหน่วย / บูรณาการ
ฉันได้พูดคุยกับใครบางคนเกี่ยวกับการทดสอบหน่วย / การรวมเข้ากับเว็บแอปพลิเคชันและฉันมีความเห็นที่ไม่ตรงกันเกี่ยวกับ 1 แนวคิดหลัก ปัญหาคือคนที่ฉันกำลังพูดถึงคิดว่าฐานข้อมูลการทดสอบหน่วยทำงานควรมีข้อมูลที่มีอยู่แล้วและฉันคิดว่ามันควรจะว่างเปล่าอย่างสมบูรณ์ก่อนและหลังการทดสอบจะดำเนินการ ความกังวลของฉันกับข้อมูลที่มีการเติมข้อมูลไว้ล่วงหน้าในฐานข้อมูลคือไม่มีวิธีใดที่จะทำให้แน่ใจว่าข้อมูลนั้นได้รับการดูแลให้อยู่ในสภาพที่ดี การทดสอบจะสร้างลบและแก้ไขข้อมูลในฐานข้อมูลดังนั้นฉันจึงไม่เห็นว่ามีข้อมูลในฐานข้อมูลก่อนที่คุณจะเริ่มการทดสอบเป็นสิ่งที่ดี ดูเหมือนว่าวิธีที่ดีที่สุดในการทดสอบการทำงานของฐานข้อมูลจะมีการตั้งค่าต่อไปนี้: ในขั้นตอน "การตั้งค่า" ก่อนที่การทดสอบจะทำงานจริงคุณจะตัดทอนตารางทั้งหมดในฐานข้อมูลก่อน จากนั้นคุณแทรกข้อมูลทั้งหมดที่จำเป็นสำหรับกรณีทดสอบที่คุณกำลังจะเรียกใช้ จากนั้นคุณเรียกใช้และตรวจสอบกรณีทดสอบ จากนั้นในช่วง "teardown" คุณจะตัดทอนตารางทั้งหมดในฐานข้อมูลอีกครั้ง ฉันไม่เห็นวิธีที่ดีกว่าอื่น ๆ ในการตรวจสอบให้แน่ใจว่าข้อมูลที่คุณกำลังทดสอบมีการทดสอบที่ดี ฉันทำอะไรบางอย่างหายไปหรือเปล่า นี่ไม่ใช่วิธีที่ดีที่สุดในการทดสอบการทำงานของฐานข้อมูลหรือไม่ มีประโยชน์ไหมที่จะมีฐานข้อมูลที่ถูกเติมไว้ล่วงหน้าซึ่งมีอยู่เสมอในฐานข้อมูล (แม้กระทั่งก่อนที่คุณจะเริ่มการทดสอบหรือหลังจากการทดสอบเสร็จสิ้นแล้ว)? ความช่วยเหลือใด ๆ ในแนวคิดที่จะอธิบายกระบวนการของฉันแตกต่างกันเพื่อให้ประเด็นของฉันดีขึ้นก็จะดีเช่นกัน (นั่นคือถ้าประเด็นของฉันมีข้อดี)

2
การทดสอบแบบรวมใช้ mocks หรือไม่
ขณะนี้ฉันอยู่ในชั้นเรียนสำหรับการทดสอบซอฟต์แวร์ที่สำหรับโครงการภาคการศึกษาของเราเราต้องทำการทดสอบหลายประเภทเช่นการทดสอบหน่วยและการทดสอบการรวม สำหรับการทดสอบการรวมตัวอาจารย์กล่าวว่าจะใช้ห้องสมุด mocks และการเยาะเย้ย (เช่น EasyMock และ Mockito) สำหรับการทดสอบการรวมกลุ่มของเรา ฉันเริ่มสับสนแล้ว การทดสอบการรวมเป็นการทดสอบนอกชั้นเรียนโมดูลบริการ ฯลฯ เหตุใด mocks และ stubs จึงเหมาะสมที่จะใช้ในการทดสอบการรวมหากคุณกำลังทดสอบคลาสและบริการที่หลากหลาย

4
CI สามารถใช้สำหรับภาษาที่ตีความได้อย่างไร
ฉันไม่เคยใช้ระบบการรวมต่อเนื่อง (CI) มาก่อน ฉันใช้รหัสเป็นหลักใน MATLAB, Python หรือ PHP ทั้งสองอย่างนี้มีขั้นตอนการสร้างและฉันไม่เห็นว่าจะใช้ CI สำหรับงานของฉันได้อย่างไร เพื่อนในโครงการขนาดใหญ่ใน บริษัท ขนาดใหญ่บอกฉันว่าภาษาไม่สำคัญ ฉันไม่เห็นว่า CI จะเป็นประโยชน์กับฉันอย่างไรหากฉันไม่มีขั้นตอนการสร้าง ฉันคิดว่า CI เป็นสภาพแวดล้อมการทดสอบที่จะเรียกใช้การทดสอบหน่วย ฉันพลาดอะไรไปรึเปล่า?

8
จะจัดการกับการทดสอบที่ล้มเหลวจำนวนมากได้อย่างไร [ปิด]
ปิด คำถามนี้จะต้องมีมากขึ้นมุ่งเน้น ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้มุ่งเน้นที่ปัญหาเดียวโดยแก้ไขโพสต์นี้ ปิดให้บริการใน4 ปีที่แล้ว ฉันกำลังทำงานในการพัฒนาโครงการเก่าที่เขียนใน Java เรามีมากกว่า 10 ล้าน LOC และยิ่งกว่านั้นมากกว่า 4,000 ทดสอบการทำงาน การทดสอบที่กำหนดโดยฮัดสันนั้นล้มเหลวอย่างบ้าคลั่งเมื่อมีการเปลี่ยนแปลงรหัสที่ใหญ่กว่าทุกครั้ง การตรวจสอบความล้มเหลวในการทดสอบ - หากเป็นปัญหาในผลิตภัณฑ์หรือในการทดสอบใช้เวลาเป็นเดือน เราไม่สามารถลบการทดสอบเก่าออกได้เพราะเราไม่รู้ว่าเป็นการทดสอบอะไร! เราทำอะไรได้บ้าง วิธีดำเนินการกับการทดสอบแบบดั้งเดิมจำนวนเท่าใด

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