سؤال

سمعت أن هناك إمكانية لتمكين اختبار فصول Google-Testcase من فصول الدروس الخاصة بي ، وبالتالي تمكين الاختبارات من الوصول إلى أعضائي الخاصة/المحمية.

كيف تنجز ذلك؟

هل كانت مفيدة؟

المحلول

جرب هذا (مباشرة من مستندات اختبار Google ...):

FRIEND_TEST(TestCaseName, TestName);

علي سبيل المثال:

// foo.h
#include <gtest/gtest_prod.h>

// Defines FRIEND_TEST.
class Foo {
  ...
 private:
  FRIEND_TEST(FooTest, BarReturnsZeroOnNull);
  int Bar(void* x);
};

// foo_test.cc
...
TEST(FooTest, BarReturnsZeroOnNull) {
  Foo foo;
  EXPECT_EQ(0, foo.Bar(NULL));
  // Uses Foo's private member Bar().
}

نصائح أخرى

أعلم أن هذا قديم لكنني كنت أبحث عن نفس الإجابة اليوم. "gtest_prod.h" يقدم فقط ماكرو بسيط للإشارة إلى فئات الاختبار.

#define FRIEND_TEST(test_case_name, test_name)\
friend class test_case_name##_##test_name##_Test

لذا FRIEND_TEST(FooTest, BarReturnsZeroOnNull); يعادل:

friend class FooTest_BarReturnsZeroOnNull_Test;

هذا يعمل لأن كل اختبار هو فئة خاصة به كما هو مذكور في الإجابة السابقة.

تتمثل الإستراتيجية الأفضل بكثير في عدم السماح باختبارات الأصدقاء بين اختبارات وحدتك.

سيؤدي السماح لاختبارات الأصدقاء بالوصول إلى الأعضاء الخاصين إلى قاعدة رمز يصعب الحفاظ عليها. الاختبارات التي تنهار كلما تم إعادة إعادة تصميم تفاصيل التنفيذ الداخلية للمكون ليست ما تريد. إذا تم بذل جهد إضافي بدلاً من ذلك في الحصول على تصميم حيث يمكن اختبار المكونات من خلال الواجهة العامة الخاصة بها ، فستحصل على اختبارات تحتاج فقط إلى التحديث عند تحديث الواجهة العامة للمكون.

الاختبارات التي تعتمد على gtest/gtest_prod.h ينبغي أن ينظر إليها على أنها علامة على التصميم السيئ.

عندما تكون فئة الاختبار الخاصة بك وفئة الاختبار في مساحة اسم مختلفة (على سبيل المثال ، تكون الاختبارات الخاصة بك في مساحة الاسم العالمية) ، فقد تحتاج إلى إعادة توجيه فئة الاختبار الخاصة بك وإضافة بادئة مساحة الاسم في Friend_Test:

// foo.h
#include <gtest/gtest_prod.h>

class FooTest_BarReturnsZeroOnNull_Test;

// Defines FRIEND_TEST.
class my_namespace::Foo {
  ...
 private:
  FRIEND_TEST(::FooTest, BarReturnsZeroOnNull);
  int Bar(void* x);
};

// foo_test.cc
using namespace my_namespace;

...
TEST(FooTest, BarReturnsZeroOnNull) {
  Foo foo;
  EXPECT_EQ(0, foo.Bar(NULL));
  // Uses Foo's private member Bar().
}

أعلم أن اختبارات وحدة الأصدقاء (أو الود في C ++ بشكل عام) واختبار الصندوق الأبيض هي موضوع مثير للجدل ، ولكن عندما تعمل على خوارزميات علمية معقدة ، كل خطوة تحتاجها إلى اختبارها والتحقق منها ، ولكنك لا ترتدي "تريد الكشف عن واجهات عامة (أو حتى محمية) ، تظهر اختبارات الأصدقاء لي كحل بسيط وعملي ، خاصة في نهج التطوير الذي يحركه الاختبار. من الممكن دائمًا إعادة تشكيل الكود لاحقًا (أو لإزالة اختبارات الصناديق البيضاء تمامًا) إذا كان ضد دين الفرد لاستخدام الود أو اختبار الصندوق الأبيض.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top