ทำไมคุณถึงเขียนหน่วยทดสอบสำหรับคอนโทรลเลอร์?


22

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

public class ConstituencyControllerTests
{
    private ConstituencyController _constituencyController;
    private Mock<IConstituencyService> _IConstituencyServiceMock;

    public ConstituencyControllerTests() {
        _IConstituencyServiceMock = new Mock<IConstituencyService>();
    }

    [Test]
    public async Task I_Check_For_Return_Type_And_Result() {
        _constituencyController = new ConstituencyController( _IConstituencyServiceMock.Object );

        var result = await _constituencyController.Get();
        var content = ( (dynamic)result ).Content;

        Assert.IsEmpty( content );
        Assert.IsInstanceOf( typeof( System.Web.Http.Results.OkNegotiatedContentResult<IEnumerable<ListOfConstituencies>> ), result );
        _IConstituencyServiceMock.Verify( x => x.ListOfConstituencies(), Times.Once() );
    }
}


7
ไม่เห็นด้วยกับ @gnat สิ่งนี้ไม่เกี่ยวกับการสร้างภาษาที่จำเป็น แต่เกี่ยวกับชนิดของผลลัพธ์ที่ส่งคืนโดยคอนโทรลเลอร์ ในขณะที่มันอาจเดือดลงไปในการเรียงลำดับของสิ่งเดียวกันเมื่อคุณไม่มีลำดับชั้นการสืบทอดมันจะกลายเป็นสัตว์ร้ายที่แตกต่างกันโดยสิ้นเชิงเมื่อตัวควบคุมคาดว่าจะส่งคืนบรรพบุรุษผู้ควบคุมกลับบุคคลและตอนนี้คนก็เปลี่ยน ... ตอบด้วยเช่นกันว่าทำไมการทดสอบวิธีการนี้อาจเป็นความคิดที่ดี ... ;) การทดสอบหน่วยมีไว้เพื่อเลือกสถานการณ์ที่การเปลี่ยนแปลงในสิ่งหนึ่ง c / จะทำลายอย่างอื่น
Marjan Venema


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

คำตอบ:


29

จุดสำคัญอยู่ที่นี่:

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

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

แก้ไข: การเพิ่ม @anotherdave ความคิดเห็น:

มันเกี่ยวกับการปรับขนาดได้ง่าย การทดสอบคอนโทรลเลอร์หนึ่งตัวในเบราว์เซอร์อาจใช้ได้ แล้วคอนโทรลเลอร์ 10, 20, 50 ล่ะ คุณจะเขียนบททดสอบหนึ่งครั้ง คุณอาจต้องอัปเดตเมื่อคุณเปลี่ยนคอนโทรลเลอร์ซึ่งเป็นโอเวอร์เฮด แต่คุณปรับใช้บ่อยแค่ไหน? แน่นอนตรวจสอบด้วยตนเองทุกครั้งที่มีค่าใช้จ่ายมากขึ้นว่าการทดสอบ

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

นั่นคือถ้าคุณทดสอบทุกสิ่งคุณต้องอัปเดตการทดสอบหนึ่งครั้งขึ้นไปในแต่ละครั้งที่คุณปรับเปลี่ยนองค์ประกอบอย่างง่าย


4
รวมถึงการเพิ่มใหม่: I would know perfectly well if this controller returned the wanted type by executing the method in a browser.- มันเป็นเรื่องของการปรับขนาดได้อย่างง่ายดาย การทดสอบคอนโทรลเลอร์หนึ่งตัวในเบราว์เซอร์อาจใช้ได้ แล้วคอนโทรลเลอร์ 10, 20, 50 ล่ะ คุณจะเขียนบททดสอบหนึ่งครั้ง คุณอาจต้องอัปเดตเมื่อคุณเปลี่ยนคอนโทรลเลอร์ซึ่งเป็นโอเวอร์เฮด แต่คุณปรับใช้บ่อยแค่ไหน? แน่นอนตรวจสอบด้วยตนเองทุกครั้งที่มีค่าใช้จ่ายมากขึ้นว่าการทดสอบ
อีก

"การทดสอบหน่วยเป็นเรื่องเกี่ยวกับระบบอัตโนมัติ" - ถูกต้องอย่างไรก็ตามการทดสอบการรวมระบบ (Selenium / Webdriver / etc) ฉันไม่คิดว่ามันจะต้องถูกตัดและทำให้แห้งซึ่งการทดสอบหน่วยจะเร็วกว่าการใช้การทดสอบแบบรวม หลายอย่างขึ้นอยู่กับวิธีการ แต่ถ้าการทดสอบหน่วยที่มีประสิทธิภาพนั้นต้องการการเยาะเย้ยบริการและการโทรที่แตกต่างกันออกไปการทดสอบการรวมอาจจะเร็วกว่าในการติดตั้งและง่ายต่อการบำรุงรักษา . ประเด็นคือมากขึ้นอยู่กับบริบทและความซับซ้อนของรหัสภายใต้การทดสอบ
aroth

@anotherdave เพิ่มความคิดเห็น
Walfrat

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

24

ทำไมคุณถึงเขียนหน่วยทดสอบสำหรับคอนโทรลเลอร์?

เพราะหากไม่รู้บริบทคุณไม่สามารถพูดได้อย่างแน่นอนถ้าคุณต้องการทดสอบสิ่งนี้หรือสิ่งนั้น ต่อไปนี้คือสาเหตุบางประการที่คุณอาจต้องการทดสอบคอนโทรลเลอร์

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

2
ฉันจะเพิ่ม: "คุณไม่สามารถคาดการณ์ได้ว่าใครในอนาคตที่จะกำจัดโครงการและการทดสอบเป็นส่วนหนึ่งของรหัสเอกสารด้วยตนเอง"
Laiv

4
จนถึงจุดกึ่งกลางโครงการที่สร้างขึ้นโดยไม่มีการทดสอบในใจอาจไม่สามารถทดสอบด้วยวิธีอื่นใดนอกเหนือจากการทดสอบคอนโทรลเลอร์โดยไม่มี mocks ฉันทำงานกับทีม C # ที่มีโครงการดังกล่าวอยู่ในความดูแลดังนั้นพวกเขาจึงกำลังเขียนการทดสอบคอนโทรลเลอร์จนกว่าพวกเขาจะสามารถเพิ่มโครงสร้างที่จำเป็น (อินเทอร์เฟซ ฯลฯ ) เพื่อให้สามารถทำการทดสอบที่ละเอียดยิ่งขึ้น
Wayne Conrad

1

ฉันเห็นด้วยกับ OP อย่างสมบูรณ์

การทดสอบหน่วยสำหรับคอนโทรลเลอร์ไม่มีจุดหมาย คุณทดสอบตัวควบคุมโดยนัยผ่านการทดสอบการถดถอย (โดยใช้ซีลีเนียมเป็นต้น)

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


อาจเป็นเช่นนั้น แต่นั่นไม่ใช่คำตอบสำหรับคำถาม ในความเป็นจริงมันเป็นข้อโต้แย้งกับการใช้หน่วยทดสอบที่นี่
JᴀʏMᴇᴇ

ฉันคิดว่าฉันตอบคำถามว่า "คุณเชื่อหรือไม่ว่าจำเป็นต้องทำแบบทดสอบนี้และทำไม"
วิงค์เบรซ

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

ลอจิกคอนโทรลเลอร์สามารถทดสอบได้โดยใช้การทดสอบการรวมอัตโนมัติแยกและแตกต่างจากการทดสอบหน่วยสำหรับแต่ละส่วนประกอบ
KevBurnsJr

-1: การทดสอบหน่วยสำหรับคอนโทรลเลอร์อาจไม่มีจุดหมาย ตัวควบคุมนั้นเกี่ยวกับการเปลี่ยนแปลง แต่บางครั้งการเปลี่ยนแปลงนั้นซับซ้อนและนักพัฒนาอาจต้องการให้มันครอบคลุม ผมยังคิดว่าการทดสอบหน่วย 1) ในท้ายที่สุดเกี่ยวกับการตรวจสอบการดำเนินงานไม่จำเป็นต้องตรวจสอบพฤติกรรมระดับสูงและ 2) ที่ควรจะเป็นคำด่าอย่างรวดเร็ว คุณสมบัติทั้งสองนี้ทำให้การทดสอบหน่วยมีประโยชน์มากขึ้นในช่วงเวลาดำเนินการ ในคำอื่น ๆ ที่พวกเขาอยู่ในท้ายที่สุดเครื่องมือนักพัฒนาและเพียงแค่บังเอิญวิธีการตรวจสอบคุณภาพของผลิตภัณฑ์
rsenna
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.