วิธีเรียกใช้กรณีทดสอบเฉพาะใน GoogleTest


125

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

Test_Cases_1
         |_TestNo1
         |_TestNo2....so on
Test_Cases_2
         |_TestNo1
         |_TestNo2....so on
....
....so on
Test_Cases_N
         |_TestNo1
         |_TestNo2....so on

ดังนั้นตอนนี้ความท้าทายคือในขณะที่ดำเนินโครงการควรแจ้งให้ฉันทราบว่าคุณต้องการดำเนินการทดสอบกรณีใดบ้าง ถ้าฉันเลือกTest_Cases_1และTest_Cases_N. แล้วมันควรจะดำเนินการทั้งสองกรณีทดสอบและควรแยกอื่น ๆ Test_Cases_2 to ....ทั้งหมดจาก ในหน้าต่างผลผมก็อยากจะเห็นผลของการและTest_Cases_1Test_Cases_N

ดังนั้นถ้าฉันจะดู GoogleTest มีวิธีที่เรียกว่าtest_case_to_run_count(); แต่ทั้งหมดtest casesได้รับการลงทะเบียนด้วยวิธี Test_F () ดังนั้นฉันจึงทำการวิเคราะห์มากมาย แต่ก็ยังไม่พบวิธีแก้ปัญหาใด ๆ โปรดช่วยฉันด้วย

คำตอบ:


181

คุณสามารถใช้ตัวเลือกขั้นสูงเพื่อเรียกใช้การทดสอบของ Google

ในการรันการทดสอบหน่วยบางส่วนเท่านั้นคุณสามารถใช้--gtest_filter=Test_Cases1*ตัวเลือกบรรทัดคำสั่งที่มีค่าที่ยอมรับ*และ?สัญลักษณ์แทนสำหรับการจับคู่กับการทดสอบหลายรายการ ฉันคิดว่ามันจะแก้ปัญหาของคุณได้

UPD:

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

  1. รับผลการทดสอบทั้งหมดโดยเรียกใช้การทดสอบด้วย --gtest_list_tests
  2. แยกวิเคราะห์ข้อมูลนี้ลงใน GUI ของคุณ
  3. เลือกกรณีทดสอบที่คุณต้องการรัน
  4. เรียกใช้การทดสอบปฏิบัติการด้วยตัวเลือก --gtest_filter

ฉันขอแนะนำสิ่งนี้และหากคุณต้องการระบบที่ใช้พร้อมต์ฉันขอแนะนำให้สร้างสคริปต์ Wrapper ที่รับข้อมูลผู้ใช้และรันโปรแกรมทดสอบตามนั้น
boycy

@nogard: ใช่คุณมีสิทธิ แต่ / จุดมุ่งหมายของเราของฉันคือการมี GUI ซึ่งจะมีTreeของและTestCases TestNoแล้วคุณคิดว่า--gtest_filter=..จะช่วยไหม?
Rasmi Ranjan Nayak

@nogard: ขอบคุณมากสำหรับความช่วยเหลือ ... ฉันจะดำเนินการต่อตามที่คุณได้กำหนดไว้ .. ฉันจะแจ้งให้คุณทราบเมื่อฉันทำเสร็จแล้ว
Rasmi Ranjan Nayak

1
@nogard: ฉันกำลังทำเช่นเดียวกับที่คุณกำกับ int main(int argc, char **argv) { //::testing::GTEST_FLAG(list_tests) = true; // For Testing InitGoogleTest(&argc, argv); ::testing::GTEST_FLAG(list_tests) = true; ........ RUN_ALL_TEST();...}แต่จะพิมพ์เฉพาะ Testcase และ TestNo และ แต่ไม่ได้ทำการทดสอบ ฉันจะทำการทดสอบตอนนี้ได้อย่างไร?
Rasmi Ranjan Nayak

@RasmiRanjanNayak: ฉันเสนอว่าจะไม่เปลี่ยนเมนเลย ฉันเสนอให้เรียกใช้การทดสอบสองครั้ง: ครั้งที่ 1 เพื่อรันด้วย --gtest_list_tests จากนั้นรันครั้งที่ 2 สำหรับการทดสอบที่เลือกพร้อมตัวเลือก --gtest_filter
nogard

91

สรุปคำตอบของ @Rasmi Ranjan Nayak และ @nogard และเพิ่มตัวเลือกอื่น:

บนคอนโซล

คุณควรใช้ธง--gtest_filterเช่น

--gtest_filter=Test_Cases1*

(คุณสามารถทำได้ในคุณสมบัติ | คุณสมบัติการกำหนดค่า | การดีบัก | อาร์กิวเมนต์คำสั่ง)

เกี่ยวกับสิ่งแวดล้อม

คุณควรตั้งค่าตัวแปรGTEST_FILTERเช่น

export GTEST_FILTER = "Test_Cases1*"

เกี่ยวกับรหัส

คุณควรตั้งค่าสถานะfilterเช่น

::testing::GTEST_FLAG(filter) = "Test_Cases1*";

เพื่อให้หน้าที่หลักของคุณกลายเป็นอย่างนั้น

int main(int argc, char **argv) {
    ::testing::InitGoogleTest(&argc, argv);
    ::testing::GTEST_FLAG(filter) = "Test_Cases1*";
    return RUN_ALL_TESTS();
}

ดูส่วนการเรียกใช้ชุดย่อยของการทดสอบสำหรับข้อมูลเพิ่มเติมเกี่ยวกับไวยากรณ์ของสตริงที่คุณสามารถใช้ได้


6
มีประโยชน์มากส่วน "บนรหัส" !! นี่คือสิ่งที่ฉันกำลังมองหา !!
Iero

28

ในที่สุดฉันก็ได้คำตอบ ::test::GTEST_FLAG(list_tests) = true;// จากโปรแกรมของคุณไม่ใช่คอนโซล wrt

หากคุณต้องการใช้--gtest_filter =*; /* =*, =xyz*... etc*/// คุณต้องใช้ใน Console

ดังนั้นความต้องการของฉันคือใช้จากโปรแกรมไม่ใช่จากคอนโซล

Updated:-

ในที่สุดฉันก็ได้คำตอบสำหรับการอัปเดตสิ่งเดียวกันจากโปรแกรม

 ::testing::GTEST_FLAG(filter) = "*Counter*:*IsPrime*:*ListenersTest.DoesNotLeak*";//":-:*Counter*";
      InitGoogleTest(&argc, argv);
RUN_ALL_TEST();

ขอบคุณสำหรับคำตอบทั้งหมด

คุณคนเยี่ยมมาก

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