গুগল টেস্ট: কীভাবে একটি পরীক্ষা এড়িয়ে যাবেন?


119

গুগল টেস্ট 1.6 (উইন্ডোজ 7, ​​ভিজ্যুয়াল স্টুডিও সি ++) ব্যবহার করে Using আমি কীভাবে একটি প্রদত্ত পরীক্ষা বন্ধ করতে পারি? (আমি কীভাবে কোনও পরীক্ষা চালানো থেকে আটকাতে পারি)। পুরো পরীক্ষাটি মন্তব্য করার পাশাপাশি আমি কি কিছু করতে পারি?

উত্তর:


177

ডক্স গুগল টেস্ট 1.7 জন্য সুপারিশ :

"যদি আপনার কোনও ভাঙা পরীক্ষা হয়ে থাকে যা আপনি এখনই ঠিক করতে পারবেন না, আপনি DISABLED_ উপসর্গটিকে এর নামের সাথে যুক্ত করতে পারেন This এটি কার্যকর করা থেকে বাদ দেবে" "

উদাহরণ:

// Tests that Foo does Abc.
TEST(FooTest, DISABLED_DoesAbc) { ... }

class DISABLED_BarTest : public ::testing::Test { ... };

// Tests that Bar does Xyz.
TEST_F(DISABLED_BarTest, DoesXyz) { ... }

1
এটি খুব খুঁজে পেয়েছে এবং ফিল্টারগুলি
ব্যবহারকারী

@ বিল, আমি আপনার মন্তব্য পোস্ট করার ঠিক আগে এটি পেয়েছিলাম ... (এবং আমি এটি একটি উত্তর হিসাবেও রেখেছি)। আমি তখন আমার মন্তব্য সরিয়ে ফেললাম, এটি অচল হয়ে পড়েছে ... তবে এটি বেশ ভাল তথ্য! +1
কিরিল

67

ডকুমেন্টেশন অনুসারে আপনি পরীক্ষার একটি উপসেটও চালাতে পারেন :

টেস্টের একটি সাবসেট চালানো

ডিফল্টরূপে, একটি গুগল টেস্ট প্রোগ্রাম ব্যবহারকারী নির্ধারিত সমস্ত পরীক্ষা চালায়। কখনও কখনও, আপনি কেবল পরীক্ষার একটি উপসেট চালাতে চান (উদাহরণস্বরূপ ডিবাগিং বা দ্রুত কোনও পরিবর্তন যাচাই করার জন্য)। আপনি যদি GTEST_FILTER পরিবেশ পরিবর্তনশীল বা --gest_filter পতাকাটি ফিল্টার স্ট্রিংয়ে সেট করেন তবে গুগল টেস্ট কেবলমাত্র সেই পরীক্ষাগুলি চালাবে যার পুরো নামগুলি (টেস্টক্যাসনাম.টেষ্টনাম আকারে) ফিল্টারটির সাথে মেলে।

ফিল্টারটির বিন্যাস হ'ল ':' - ওয়াইল্ডকার্ড নিদর্শনগুলির পৃথকীকরণ তালিকা (ইতিবাচক প্যাটার্ন নামে পরিচিত) allyচ্ছিকভাবে পরে একটি '-' এবং অন্য ':' - পৃথক প্যাটার্ন তালিকা (যাকে নেতিবাচক প্যাটার্ন বলা হয়)। একটি পরীক্ষা ফিল্টারটির সাথে মেলে এবং যদি এটি ইতিবাচক ধরণের কোনওটির সাথে মেলে তবে theণাত্মক নিদর্শনগুলির কোনওটির সাথে মেলে না।

কোনও প্যাটার্নে '*' (কোনও স্ট্রিংয়ের সাথে মেলে) বা '' থাকতে পারে? (যে কোনও একটি চরিত্রের সাথে মেলে)। সুবিধার জন্য, ফিল্টার '* -NegativePatterns' এছাড়াও '-NegativePatterns' হিসাবে লেখা যেতে পারে।

উদাহরণ স্বরূপ:

./foo_test Has no flag, and thus runs all its tests.
./foo_test --gtest_filter=* Also runs everything, due to the single match-everything * value.
./foo_test --gtest_filter=FooTest.* Runs everything in test case FooTest.
./foo_test --gtest_filter=*Null*:*Constructor* Runs any test whose full name contains either "Null" or "Constructor".
./foo_test --gtest_filter=-*DeathTest.* Runs all non-death tests.
./foo_test --gtest_filter=FooTest.*-FooTest.Bar Runs everything in test case FooTest except FooTest.Bar. 

সবচেয়ে সুন্দর সমাধান নয়, তবে এটি কার্যকর হয়।


24

আপনি এখন GTEST_SKIP()রানটাইমে শর্তসাপেক্ষে একটি পরীক্ষা এড়াতে ম্যাক্রো ব্যবহার করতে পারেন । উদাহরণ স্বরূপ:

TEST(Foo, Bar)
{
    if (blah)
        GTEST_SKIP();

    ...
}

মনে রাখবেন এটি একটি অতি সাম্প্রতিক বৈশিষ্ট্য তাই এটি ব্যবহারের জন্য আপনার GoogleTest গ্রন্থাগারটি আপডেট করার প্রয়োজন হতে পারে।


এই বৈশিষ্ট্যটি এখনও মুক্তি পায় না। এটি কেবলমাত্র 1.8.x শাখায় অন্তর্ভুক্ত হওয়ার সম্ভাবনা নেই, কারণ সেখানে কেবলমাত্র ফিক্সগুলি গৃহীত হয়। 1.9 এখনও পাওয়া যায় না, এমনকি এই সময়ে ঘোষণা করা হয় নি।
অক্রোকয়েট

2
GTEST_SKIP()1.10.0 থেকে উপলব্ধ।
মাত্তদিবী

দুঃখের বিষয় ডকুমেন্টেশন এখনও এই চারপাশে দুর্লভ। দেখে মনে হচ্ছে এটিও রয়েছে GTEST_SKIP_("some message")(
অনুসরণের

19

পরীক্ষাগুলি অন্তর্ভুক্ত করার জন্য এখানে প্রকাশ রয়েছে যার নামগুলিতে স্ট্রিং foo1 বা foo2 রয়েছে এবং পরীক্ষাগুলি বাদ দিন যাদের নামগুলিতে স্ট্রিং বার 1 বা বার 2 রয়েছে:

--gtest_filter=*foo1*:*foo2*-*bar1*:*bar2*

10

আমি কোডে এটি করতে পছন্দ করি:

// Run a specific test only
//testing::GTEST_FLAG(filter) = "MyLibrary.TestReading"; // I'm testing a new feature, run something quickly

// Exclude a specific test
testing::GTEST_FLAG(filter) = "-MyLibrary.TestWriting"; // The writing test is broken, so skip it

আমি হয় সমস্ত পরীক্ষা চালানোর জন্য উভয় লাইনই মন্তব্য করতে পারি, আমি যে তদন্ত করছি / চালিয়ে যাচ্ছি তার একক বৈশিষ্ট্য পরীক্ষা করার জন্য প্রথম লাইনটি আপত্তিহীন করে দিতে পারি, বা কোনও পরীক্ষা ভাঙ্গা থাকলে দ্বিতীয় লাইনে কিছুটা হলেও পরীক্ষা করতে চাই।
আপনি ওয়াইল্ডকার্ড ব্যবহার করে এবং "মাই লাইব্রারি.টেষ্টনেট ওয়ার্ক *" বা "-মাইলিবারি.স্টেস্টফাইলে সিস্টেম *" লিখে একটি তালিকা লিখে বৈশিষ্ট্যগুলির একটি স্যুটও পরীক্ষা / বাদ দিতে পারেন।


এটি একটি দুর্দান্ত সমাধান। আমি ফিল্টার ফাঁকা থাকলে ডিফল্টরূপে কিছু পরীক্ষা বাদ দিতে এটি ব্যবহার করি। এগুলি সক্ষম করা যায় export GTEST_FILTER='*'
টিম্ম্ম্ম

আসলে এটি কাজ করে না কারণ ডিফল্ট " *" নয় "" " পরিবর্তে আমি কেবলমাত্র অন্য পরিবেশের পরিবর্তনশীল ব্যবহার করব যা ফিল্টারকে ওভাররাইড করে।
টিম্ম্ম্ম

আপনি কোথায় "ফিল্টার" সংজ্ঞায়িত করেছেন? এটা কি স্ট্রিং?
Beasone

আমি এটিকে সংজ্ঞায়িত করি না তাই আমি মনে করি এটি অবশ্যই গেইস্ট / গেটেস্টের অন্তর্ভুক্ত একটি বিশ্বব্যাপী হতে হবে?
পাইকচ

6

একাধিক পরীক্ষার প্রয়োজন হলে এড়িয়ে যান

--gtest_filter=-TestName.*:TestName.*TestCase

4

অন্য পদ্ধতির জন্য, আপনি আপনার টেস্টগুলি কোনও ফাংশনে মুড়িয়ে রাখতে পারেন এবং রানটাইমের সময় সাধারণ শর্তযুক্ত চেকগুলি কেবলমাত্র যদি আপনি চান তবে তা সম্পাদন করতে পারেন।

#include <gtest/gtest.h>

const bool skip_some_test = true;

bool some_test_was_run = false;

void someTest() {
   EXPECT_TRUE(!skip_some_test);
   some_test_was_run = true;
}

TEST(BasicTest, Sanity) {
   EXPECT_EQ(1, 1);
   if(!skip_some_test) {
      someTest();
      EXPECT_TRUE(some_test_was_run);
   }
}

এটি আমার পক্ষে দরকারী কারণ যখন আমি কোনও সিস্টেম দ্বৈত স্ট্যাক আইপিভি 6 সমর্থন করি তখনই আমি কয়েকটি পরীক্ষা চালানোর চেষ্টা করি।

প্রযুক্তিগতভাবে যে ডুয়েলস্ট্যাক স্টাফ সিস্টেমের উপর নির্ভর করে সত্যই এটি ইউনিট পরীক্ষা হওয়া উচিত নয়। তবে আমি যতক্ষণ না পরীক্ষা করে নিই না কেন যে কোনওভাবেই তারা কাজ করে এবং আমি এটি নিশ্চিত করি যে কোডগুলির ত্রুটি না হলে এটি ব্যর্থতার বিষয়ে রিপোর্ট করবে না।

এটির পরীক্ষার জন্য আমার কাছে স্টাব অবজেক্টস রয়েছে যা নকল সকেটগুলি নির্মাণ করে ডুয়েলস্ট্যাক (বা অভাব) এর জন্য একটি সিস্টেমের সমর্থন অনুকরণ করে।

একমাত্র ক্ষতি হ'ল পরীক্ষার আউটপুট এবং পরীক্ষার সংখ্যা পরিবর্তিত হবে যা সফল পরীক্ষার সংখ্যা পর্যবেক্ষণ করে এমন কিছু নিয়ে সমস্যা সৃষ্টি করতে পারে।

আপনি EQUAL_ * এর পরিবর্তে ASSERT_ * ব্যবহার করতে পারেন। যদি ব্যর্থ হয় তবে পরীক্ষার বাকী অংশগুলি সম্পর্কে দৃsert়তার সাথে যুক্ত করুন। কনসোলে প্রচুর রিলান্ডান্ট জিনিস ফেলে দেওয়া আটকাচ্ছে।


4

শর্তাধীন পরীক্ষাগুলির জন্য আমারও একই চাহিদা ছিল এবং আমি একটি ভাল কাজের সন্ধান করলাম। আমি একটি ম্যাক্রো TEST_C সংজ্ঞায়িত করেছি যা TEST_F ম্যাক্রোর মতো কাজ করে, তবে এটির একটি তৃতীয় প্যারামিটার রয়েছে, যা একটি বুলিয়ান এক্সপ্রেশন, মেইন.পি.পি.-তে রানটাইম মূল্যায়ন করে পরীক্ষা শুরু হওয়ার আগে। মিথ্যা মূল্যায়ন করে এমন পরীক্ষাগুলি কার্যকর করা হয় না। ম্যাক্রো কুৎসিত, তবে দেখতে এটির মতো:

#pragma once
extern std::map<std::string, std::function<bool()> >* m_conditionalTests;
#define TEST_C(test_fixture, test_name, test_condition)\
class test_fixture##_##test_name##_ConditionClass\
{\
    public:\
    test_fixture##_##test_name##_ConditionClass()\
    {\
        std::string name = std::string(#test_fixture) + "." + std::string(#test_name);\
        if (m_conditionalTests==NULL) {\
            m_conditionalTests = new std::map<std::string, std::function<bool()> >();\
        }\
        m_conditionalTests->insert(std::make_pair(name, []()\
        {\
            DeviceInfo device = Connection::Instance()->GetDeviceInfo();\
            return test_condition;\
        }));\
    }\
} test_fixture##_##test_name##_ConditionInstance;\
TEST_F(test_fixture, test_name)

অতিরিক্ত হিসাবে, আপনার মেইন.পি.পি. তে, আপনাকে মিথ্যা মূল্যায়ন করে এমন পরীক্ষাগুলি বাদ দিতে এই লুপটির প্রয়োজন:

// identify tests that cannot run on this device
std::string excludeTests;
for (const auto& exclusion : *m_conditionalTests)
{
    bool run = exclusion.second();
    if (!run)
    {
        excludeTests += ":" + exclusion.first;
    }
}

// add the exclusion list to gtest
std::string str = ::testing::GTEST_FLAG(filter);
::testing::GTEST_FLAG(filter) = str + ":-" + excludeTests;

// run all tests
int result = RUN_ALL_TESTS();

আপনি কীভাবে "ফিল্টার" সংজ্ঞায়িত করেছেন স্ট্র্যাড :: স্ট্রিং টিআর = :: পরীক্ষায় :: জিটিইএসএফএফএলজি (ফিল্টার) ;?
Beasone
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.