গুগল টেস্ট 1.6 (উইন্ডোজ 7, ভিজ্যুয়াল স্টুডিও সি ++) ব্যবহার করে Using আমি কীভাবে একটি প্রদত্ত পরীক্ষা বন্ধ করতে পারি? (আমি কীভাবে কোনও পরীক্ষা চালানো থেকে আটকাতে পারি)। পুরো পরীক্ষাটি মন্তব্য করার পাশাপাশি আমি কি কিছু করতে পারি?
গুগল টেস্ট 1.6 (উইন্ডোজ 7, ভিজ্যুয়াল স্টুডিও সি ++) ব্যবহার করে Using আমি কীভাবে একটি প্রদত্ত পরীক্ষা বন্ধ করতে পারি? (আমি কীভাবে কোনও পরীক্ষা চালানো থেকে আটকাতে পারি)। পুরো পরীক্ষাটি মন্তব্য করার পাশাপাশি আমি কি কিছু করতে পারি?
উত্তর:
ডক্স গুগল টেস্ট 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) { ... }
ডকুমেন্টেশন অনুসারে আপনি পরীক্ষার একটি উপসেটও চালাতে পারেন :
টেস্টের একটি সাবসেট চালানো
ডিফল্টরূপে, একটি গুগল টেস্ট প্রোগ্রাম ব্যবহারকারী নির্ধারিত সমস্ত পরীক্ষা চালায়। কখনও কখনও, আপনি কেবল পরীক্ষার একটি উপসেট চালাতে চান (উদাহরণস্বরূপ ডিবাগিং বা দ্রুত কোনও পরিবর্তন যাচাই করার জন্য)। আপনি যদি 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.
সবচেয়ে সুন্দর সমাধান নয়, তবে এটি কার্যকর হয়।
আপনি এখন GTEST_SKIP()
রানটাইমে শর্তসাপেক্ষে একটি পরীক্ষা এড়াতে ম্যাক্রো ব্যবহার করতে পারেন । উদাহরণ স্বরূপ:
TEST(Foo, Bar)
{
if (blah)
GTEST_SKIP();
...
}
মনে রাখবেন এটি একটি অতি সাম্প্রতিক বৈশিষ্ট্য তাই এটি ব্যবহারের জন্য আপনার GoogleTest গ্রন্থাগারটি আপডেট করার প্রয়োজন হতে পারে।
GTEST_SKIP()
1.10.0 থেকে উপলব্ধ।
GTEST_SKIP_("some message")
(
আমি কোডে এটি করতে পছন্দ করি:
// 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='*'
।
*
" নয় "" " পরিবর্তে আমি কেবলমাত্র অন্য পরিবেশের পরিবর্তনশীল ব্যবহার করব যা ফিল্টারকে ওভাররাইড করে।
অন্য পদ্ধতির জন্য, আপনি আপনার টেস্টগুলি কোনও ফাংশনে মুড়িয়ে রাখতে পারেন এবং রানটাইমের সময় সাধারণ শর্তযুক্ত চেকগুলি কেবলমাত্র যদি আপনি চান তবে তা সম্পাদন করতে পারেন।
#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়তার সাথে যুক্ত করুন। কনসোলে প্রচুর রিলান্ডান্ট জিনিস ফেলে দেওয়া আটকাচ্ছে।
শর্তাধীন পরীক্ষাগুলির জন্য আমারও একই চাহিদা ছিল এবং আমি একটি ভাল কাজের সন্ধান করলাম। আমি একটি ম্যাক্রো 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();