新葡亰496net 新葡亰编程 PHPUnit + Laravel单元测试常用技能_php实例_脚本之家

PHPUnit + Laravel单元测试常用技能_php实例_脚本之家

1. 数据要求器

Google C++单元测量试验框架谷歌Test—AdvancedGuide(译文)下,advancediqtest

因为AdvancedGuide文书档案太长,分上下两部分,本文档接googletest–AdvancedGuide(译文)上:GoogleC++单元测试框架谷歌Test—AdvancedGuide(译文)上。

用来提供参数和结果,使用 @dataProvider
标记来内定使用哪个数据必要器方法。举个例子检验app晋级数据是或不是适合预期,addProviderAppUpdateData(卡塔尔(قطر‎提供测验的参数和结果。testAppUpdateData再次回到的结果是不是和加以的预想结果特别,即假诺$appId='apple_3.3.2_117',
$result=['status' => 0, 'isIOS' => false],
则$data中如若含有['status' => 0, 'isIOS' => false],
则断言成功。建议在数据提供器,逐个用字符串键名对其命名,这样在断言失败的时候将输出失败的名称,更容易定位问题

一、在子程序中使用断言(Using Assertions in Sub-routinesState of Qatar

1.1 将追踪增添到断言

只要从几个地点调用测量试验子程序,当此中的断言失利时,可能很难剖断失利来自哪个子程序的调用。
您能够利用额外的日志或自定义退步新闻减轻这一个主题材料,但平日会杜绝您的测量检验。
越来越好的解决方案是选择SCOPED_TRACE宏:

SCOPED_TRACE(message);

messsage能够是任何能够流入std::ostream的事物。此宏会将眼下文件名、行号和加以音讯增添到各类失利新闻中。 当控件离开当前词法成效域时,效果将被收回。

For example,

 void Sub1(int n) {
   EXPECT_EQ(1, Bar(n));
   EXPECT_EQ(2, Bar(n + 1));
 }

 TEST(FooTest, Bar) {
   {
     SCOPED_TRACE("A");  // This trace point will be included in
                         // every failure in this scope.
     Sub1(1);
   }//到这SCOPED_TRACE的作用域就结束。
   // Now it won't.
   Sub1(9);//都调用了子程序Sub1
 }

恐怕会诱致那样的新闻:

path/to/foo_test.cc:11: Failure
Value of: Bar(n)
Expected: 1
  Actual: 2
   Trace:
path/to/foo_test.cc:17: A

path/to/foo_test.cc:12: Failure
Value of: Bar(n + 1)
Expected: 2
  Actual: 3

未有追踪,很难精晓三个倒闭分别来自哪个Sub1()的调用。
(你能够在Sub1()中为每种断言增多二个额外的音信,以提醒n的值,但那很枯燥。)

关于使用SCOPED_TRACE的一部分提示:

不曾追踪,很难理解八个倒闭分别来自哪个Sub1()的调用。
(你能够在Sub1()中为每一个断言增加叁个外加的音信,以提醒n的值,但那很枯燥。)

关于使用SCOPED_TRACE的有些提醒:

  • 选取方便的音讯,日常能够在子例程的开端使用SCOPED_TRACE,并不是在各类调用站点。
  • 当调用循环内的子例程时,使循环迭代器成为SCOPED_TRACE中的信息的一有的,以便你能够领略失利来自哪个迭代。
  • 神蹟,追踪点的行号足以识别子例程的特定调用。在这里种情状下,您不要为SCOPED_TRACE选取独一的音讯。你能够省略地动用“”。
  • 当外部功用域中有二个SCOPED_TRACE时,能够在其间成效域中运用SCOPED_TRACE。在此种气象下,全数活动追踪点将依据遇到的相反顺序包含在失败音讯中。
  • 追踪转储是能够在Emacs的编写翻译缓冲区中点击 –
    命中回到行号,你会被带到源文件中的那一行!
appUpdateData(); $this->assertTrue(count(array_intersect_assoc == count; } public function addProviderAppUpdateData() { return [ 'null' => [null, ['status' => 0, 'isIOS' => false, 'latest_version' => 'V']], 'error app id' => ['sdas123123', ['status' => 0, 'isIOS' => false, 'latest_version' => 'V']], 'android force update' => ['bx7_3.3.5_120', ['status' => 0, 'isIOS' => false]], 'ios force update' => ['apple_3.3.2_117', ['status' => 1, 'isIOS' => true]], 'android soft update' => ['sanxing_3.3.2_117', ['status' => 2, 'isIOS' => false]], 'ios soft update' => ['apple_3.3.3_118', ['status' => 2, 'isIOS' => true]], 'android normal' => ['fhqd_3.3.6_121', ['status' => 1, 'isIOS' => false]], 'ios normal' => ['apple_3.3.5_120', ['status' => 1, 'isIOS' => true]], 'h5' => ['h5_3.3.3', ['status' => 1, 'isIOS' => false]] ]; } }

1.2 传播致命失利

使用ASSERT_ *和FAIL
*时的左近陷阱感觉当它们退步时,它们会暂停整个测量试验。
例如,以下测量试验将会促成错误:

void Subroutine() {
  // Generates a fatal failure and aborts the current function.
  ASSERT_EQ(1, 2);//失败时只是终止当前函数
  // The following won't be executed.
  ...
}

TEST(FooTest, Bar) {
  Subroutine();
  // The intended behavior is for the fatal failure
  // in Subroutine() to abort the entire test.
  // The actual behavior: the function goes on after Subroutine() returns.
  //  实际行为:函数在Subroutine()返回后继续。
  int* p = NULL;
  *p = 3; // Segfault!产生一个错误
} 

鉴于我们不使用非常,由此在技艺上不容许在那完成预期的作为。
为了缓解这种情景,谷歌测量检验提供了三种减轻方案。 您能够行使(ASSERT |
EXPECT)_NO_FATAL_FAILURE断言或HasFatalFailure()函数。
它们在偏下两个小节中描述。

2. 预见方法

1.3在子程序中的断言(Asserting on Subroutines)

如上所示,如若您的测量试验调用了一个有ASSERT_
*退步的子程序,测验就要子程序再次来到后三回九转。 那恐怕不是您想要的。

平常人们期待致命的破产传播像那多少个同样。 为此,谷歌测量试验提供以下宏:

Fatal assertion Nonfatal assertion Verifies
ASSERT_NO_FATAL_FAILURE(statement); EXPECT_NO_FATAL_FAILURE(statement); statement doesn’t generate any new fatal failures in the current thread.

仅检查推行断言的线程中的败北,以显明这连串型的预感的结果。
倘使语句创制新线程,这几个线程中的失利将被忽略。

例如:

ASSERT_NO_FATAL_FAILURE(Foo());

int i;
EXPECT_NO_FATAL_FAILURE({
  i = Bar();
}); 

常用有assertTrue, assertNull, assertThat()。

1.4反省当前测量检验中的故障

  :: test :: Test类中的HasFatalFailure():
即便当前测量检验中的断言碰着沉重故障,则赶回true。
那允许函数捕获子例程中的致命故障并尽快重返。

class Test {
 public:
  ...
  static bool HasFatalFailure();
};

 规范的用法,基本上模拟抛出的不胜的作为是:

TEST(FooTest, Bar) {  
    Subroutine();  // Aborts if Subroutine() had a fatal failure. 
   if (HasFatalFailure())    
     return;  
   // The following won't be executed. 
   ...
}

HasFatalFailure如果在TEST(),TEST_F()或测量检验夹具之外使用,则必得抬高::
testing :: Test ::前缀,如: 

if (::testing::Test::HasFatalFailure())
  return;

近似的,HasNonfatalFailure(卡塔尔:假如当前测验至稀有叁个非致命失利,再次回到true。

HasFailure() :如若当前测验至少有二个未果,重返true。

assertThat、isTrue、isInstanceOf、logicalAnd()。举例检验重返的结果是或不是是null或ApiApp类。

二、记录其余音讯Logging Additional Information

在测量试验代码中,可以调用RecordProperty(“key”,value)来记录附加音信,此中value能够是字符串或int。
要是钦赐三个键,则为键记录的最后多少个值将发送到XML输出。

例如

TEST_F(WidgetUsageTest, MinAndMaxWidgets) {
  RecordProperty("MaximumWidgets", ComputeMaxUsage());
  RecordProperty("MinimumWidgets", ComputeMinUsage());
}

will output XML like this:

...
  <testcase name="MinAndMaxWidgets" status="run" time="6" classname="WidgetUsageTest"
            MaximumWidgets="12"
            MinimumWidgets="9" />
...

注意:

  • RecordProperty()是Test类的静态成员。
    因而,举例在TEST体和测量试验夹具类之外使用,则需求运用前缀:: testing
    :: Test ::
  • 键必需是实用的XML属性名称,且不可能与GoogleTest(名称,状态,时间,类名,类型_参数和值_参数)已运用的键冲突。
  • 允许在测验的生命周期之向外调运用RecordProperty()。
    倘诺它在测量检验之向外调运用,但在测量检验用例的SetUpTestCase()和TearDownTestCase()方法之间调用,它将被归因于测量检验用例的XML成分。
    假如在富有测量试验用例之向外调拨运输用(举个例子在测试蒙受中),它将被归因于顶尖XML成分。
assertThat($result, $this->logicalOr, $this->isInstanceOf; } public function additionProviderGetLatestUpdateAppApi() { return [ 'apple' => [1], 'android' => [2], 'null' => [9999] ]; } }

三、在雷同测量检验用例中的测量试验时期分享能源

谷歌(Google卡塔尔国Test为各样测验创立叁个新的测量试验夹具对象,以使测量检验独立,更易于调节和测量检验。
可是,有的时候测验使用昂贵的财富设置,使得单拷贝测量试验模型过于昂贵。

即使测量检验不退换资源,则它们在分享单个能源别本中未有其余风险。
因而,除了每趟测验的set-up/tear-down,Google测验还扶助每一个测验用例的set-up/tear-down。
使用它:

  • 在你的测验夹具类(比如FooTest)中,定义一些分子变量来保存分享财富。
  • 在同叁个测量试验夹具类中,定义三个静态void
    SetUpTestCase()函数(牢牢记住不要拼写它作为叁个小u的SetupTestCase)来设置分享能源和静态void
    TearDownTestCase()函数来删除它们。

OK!
在运营FooTest测量检验用例中的第三个测量检验(即在创建第叁个FooTest对象此前)此前,GoogleTest自动调用SetUpTestCase(),并在运营最后叁个测量检验之后(即除去最后贰个FooTest对象后)调用TearDownTestCase()。
在里面,测量试验可以应用分享能源。

切记测量试验顺序是未定义的,所以你的代码不可能依赖于另二个事情发生以前或之后的测量试验。
别的,测验必得无法改改任何分享能源的动静,或然,要是它们改革处境,则它们必需在将调控传递给下八个测验早前将状态恢复到其原始值。

Here’s an example of per-test-case set-up and tear-down:

class FooTest : public ::testing::Test {
 protected:
  // Per-test-case set-up.
  // Called before the first test in this test case.
  // Can be omitted if not needed.
  static void SetUpTestCase() {
    shared_resource_ = new ...;
  }

  // Per-test-case tear-down.
  // Called after the last test in this test case.
  // Can be omitted if not needed.
  static void TearDownTestCase() {
    delete shared_resource_;
    shared_resource_ = NULL;
  }

  // You can define per-test set-up and tear-down logic as usual.
  virtual void SetUp() { ... }
  virtual void TearDown() { ... }

  // Some expensive resource shared by all tests.
  static T* shared_resource_;
};

T* FooTest::shared_resource_ = NULL;

TEST_F(FooTest, Test1) {
  ... you can refer to shared_resource here ...
}
TEST_F(FooTest, Test2) {
  ... you can refer to shared_resource here ...
}

3. 对极其进行测验

四、Global Set-Up and Tear-Down

正如你能够在测量检验等第和测量检验用例等级设置和拆除与搬迁,您也足以在测量试验程序等第实施。

首先,你要世袭:: testing :: Environment类来定义贰个测验情状:

class Environment {
 public:
  virtual ~Environment() {}
  // Override this to define how to set up the environment.
  virtual void SetUp() {}
  // Override this to define how to tear down the environment.
  virtual void TearDown() {}
};

下一场,通过调用:: testing :: Add Global Test
Environment()函数,注册我们的遇到类的实例:

Environment* AddGlobalTestEnvironment(Environment* env);

现在,当调用RUN_ALL_TESTS()时,它首先调用情形目的的SetUp()方法,然后若无沉重失利则运维测量检验,最终调用意况目的的TearDown()。

登记三个碰到目的是可以的。
在这种意况下,他们的SetUp()将依照它们注册的顺序被调用,并且它们的TearDown()将以相反的相继被调用。

请介怀,谷歌测试会对注册的条件指标具有全体权。
由此,永不本人删除它们。

你应该在调用RUN_ALL_TESTS()早前调用AddGlobalTestEnvironment(),可能在main()中调用。
倘令你利用gtest_main,你须求在main()运行以前调用它技巧见到成效。
一种办法是概念三个全局变量,如下所示:

::testing::Environment* const foo_env = ::testing::AddGlobalTestEnvironment(new FooEnvironment); 

不过,大家刚强提出您编写自个儿的main()并调用AddGlobalTestEnvironment(),因为依据于全局变量的开端化使代码更难读取,何况只怕会招致难题,当你从不一样的转换单元注册七个条件,
它们之间的信赖性(记住编写翻译器不保障来自分化转变单元的全局变量的初步化顺序)。

使用expectExceptionCode()对错误码进行检验,不建议对错误信息文案实行检查测量检验。比如检查实验设备被锁后是或不是抛出3026错误码。

 五、值参数化测量试验

//那些效应挺复杂,特地写在一个单身的文书档案深入剖析:

 

expectExceptionCode; Cache::put('device-login-error-account-', '1,2,3,4,5', 300); UserSecurityService::$request = null; UserSecurityService::$udid = null; UserSecurityService::deviceCheck; } }

 六、类型测验

倘令你有三个接口的三个完毕,并期待确认保障全体那么些都满意一些宽广的需求。
只怕,您恐怕定义了多少个等级次序,它们应该相符相通的“概念”,并且您想要验证它。
在此两种情形下,您都期望为不相同品种重复相近的测量试验逻辑。 

 即便你可认为您想测量检验的每一种品种写八个TEST或TEST_F(你以至足以把测验逻辑放入你从TEST调用的函数模板),它是没有味道的,不缩放:要是您想要m个测量试验n类型,你最后会写m * n TESTs。

类型测量试验允许你在品种列表上海重机厂复相符的测量检验逻辑。
你只须要写一遍测量检验逻辑,即便在写类型测量试验时您不得不知道类型列表。
以下是你的操作方法:

1. 概念三个fixture类模板。 它应当由一个品类参数化。 记住世襲:: testing
:: Test:

template <typename T>
class FooTest : public ::testing::Test {
 public:
  ...
  typedef std::list<T> List;
  static T shared_;
  T value_;
};

2. 将品种列表与测量检验用例相关联,这将本着列表中的每一种品种重复:

typedef ::testing::Types<char, int, unsigned int> MyTypes;
TYPED_TEST_CASE(FooTest, MyTypes);

typedef对于TYPED_TEST_CASE宏正确深入分析是要求的。
不然编写翻译器会感觉类型列表中的每一种逗号引进八个新的宏参数。

3. 使用TYPED_TEST()而不是TEST_F()为此测量检验用例定义二个档案的次序测验。
您能够依靠要求再一次此操作次数:

TYPED_TEST(FooTest, DoesBlah) {
  // Inside a test, refer to the special name TypeParam to get the type
  // parameter.  Since we are inside a derived class template, C++ requires
  // us to visit the members of FooTest via 'this'.
  TypeParam n = this->value_;

  // To visit static members of the fixture, add the 'TestFixture::'
  // prefix.
  n += TestFixture::shared_;

  // To refer to typedefs in the fixture, add the 'typename TestFixture::'
  // prefix.  The 'typename' is required to satisfy the compiler.
  typename TestFixture::List values;
  values.push_back(n);
  ...
}

TYPED_TEST(FooTest, HasPropertyA) { ... }

You can see samples/sample6_unittest.cc for a complete example.

4. 测量检验私有属性和个体方法运用反射机制

七、类型参数化测量检验

在不驾驭类型参数的意况下编写制定测量检验— 那正是“类型参数化测量检验”。

品类参数化测量检验临近于类型测量检验,除了它们无需预言类型列表。
相反,您能够率先定义测量检验逻辑,然后利用分裂类型列表实例化它。
你依旧足以在同二个顺序中频仍实例化它。

固然您正在设计二个接口或概念,则能够定义一组项目参数化测量检验,以证实接口/概念的此外有效落到实处应享有的性质。
然后,每一种完结的审核人能够选择他的类型来实例化测量试验套件,以注脚它相符必要,而不要再一次地编写相像的测量试验。
这里有三个事例:

1. 概念叁个fixture类模板,就像是大家用途目测量检验相近:

First, define a fixture class template, as we did with typed tests:

template <typename T>
class FooTest : public ::testing::Test {
  ...
};

2. 宣称你要定义的门类参数化测验用例:

TYPED_TEST_CASE_P(FooTest);

本条后缀P代表参数化或形式,随你怎么想。

  1. 使用TYPED_TEST_P(卡塔尔(قطر‎来定义类型参数化测验。您能够依据须要再行多次:

    TYPED_TEST_P(FooTest, DoesBlah) {
    // Inside a test, refer to TypeParam to get the type parameter.
    TypeParam n = 0;

    }

    TYPED_TEST_P(FooTest, HasPropertyA) { … }

这段时间别无选取的一些:您需求接收REGISTE库罗德_TYPED_TEST_CASE_P宏注册全体育项目检测试方式,然后技艺实例化它们。

宏的第叁个参数是测量试验用例名称; 其他的是在这里个测量试验用例中的测验的名号

REGISTER_TYPED_TEST_CASE_P(FooTest,
                           DoesBlah, HasPropertyA);

终极,你能够用你想要的连串来实例化方式。
借使你把上面的代码放在头文件中,你能够在五个C
++源文件#include它,并实例化多次。

typedef ::testing::Types<char, int, unsigned int> MyTypes;
INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, MyTypes);

为了差异格局的两样实例,INSTANTIATE_TYPED_TEST_CASE_P宏的首先个参数是将助长到实际测验用例名称中的前缀。 请牢记为差异实例选用独一前缀

在档次列表只含有四个等级次序的例外处境下,您能够间接编写该品种,而不选取::
testing :: Types <…>,如下所示:

INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, int);

ou can see samples/sample6_unittest.cc for a complete example.

**连串测量试验与项目参数化的不相同:

1. 档次测验是你知道全体的连串,把持有项目注册,实例化测验。

2.
门类参数化是您是接口的定义者,知道各类接口函数的功底用,而它的切切实实落实能够在现在被
  人达成,你可以提前定义好测量检验用例,然后把装有的测量试验注册。

若是只测验私有方法可选拔ReflectionMethod()反射方法,使用setAccessible设置模式可访谈,并使用invokeArgs调用方法。譬如检查评定IP是或不是在白名单中。

八、测验private修饰的代码

一旦您改进软件的中间得以完成,只要客户无法观测到这种退换,您的测验就不会暂停。
由此,依照黑盒测验原则,大好多时候你应有通过其公共接口测量检验你的代码。

即使您照旧发掘本人必要测验之中贯彻代码,考虑是不是有三个越来越好的宏图,没有要求您这么做。
固然你必须测验非公共接口代码。 有二种情景供给考虑:

  •  静态函数(差异于静态成员函数!)或未命名的命名空间
  •  私人或受保证的类成员
namespace AppFacadesServices; /** * Class WebDefender */ class WebDefenderService extends BaseService { //ip白名单 private $ipWhiteList = [ '10.*', '172.18.*', '127.0.0.1' ]; /** * ip是否在白名单中 * * @param string $ip * * @return bool */ private function checkIPWhiteList { if (!$this->ipWhiteList || !is_array { return false; } foreach ($this->ipWhiteList as $item) { if (preg_match { return true; } } return false; } }

setAccessible; $this->assertEquals($result, $checkIPWhiteList->invokeArgs(new WebDefenderService; } public function additionProviderIp() { return [ '10 ip' => ['10.1.1.7', true], '172 ip' => ['172.18.2.5', true], '127 ip' => ['127.0.0.1', true], '192 ip' => ['192.168.0.1', false] ]; } }

 1. 静态函数

未命名的命名空间中的静态函数和概念/申明仅在相像转变单元中可以见到。要测验它们,您能够在您的*
_test.cc文件中include 要测量检验的成套.cc文件。 (#include
.cc文件不是援引代码的好法子 – 你不该在临盆代码中那样做!)

可是,越来越好的章程是将个人代码移动到foo ::
internal命名空间中,个中foo是您项目平日接纳的命名空间,并将个人证明放在*
-internal.h文件中。允许你的临蓐.cc文件和测量检验包含此此中标头,可是你的顾客端不满含。那样,您能够完全测验你的在那之中落到实处,而不会败露到你的顾客端。

测验私有属性可选择ReflectionClass(), 获取属性用getProperty(),
设置属性的值用setValue(), 获取方式用getMethod(),
设置属性和措施可被访谈使用setAccessible。比方检验白名单路线。

2. 私有类成员

私人class成员只可以从班class或友元类这里接触。要访谈类的私人商品房成员,能够将测量试验夹具评释为类的意中人,并在夹具中定义访谈器。使用夹具的测量检验,能够通过夹具中的访问器访谈您的临蓐类的村办成员。注意,即便你的夹具是您的分娩类的恋人,你的测量检验不是它的友元类,因为她俩技艺上是概念在夹具的子类中。

另一种测验私有成员的主意是将它们重构为二个兑现类,然后在*
-internal.h文件中宣称它。您的客商端区别意包含此标题,但你的测量试验可以。这种称为Pimpl(私有完结)习语。

照旧,您可以由此在类入眼中加多以下行,将独家测量检验注明为class的友元类:

FRIEND_TEST(TestCaseName, TestName);

  For example,

// 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().
}

当您的类在命名空间中定义时,要求非常注意,因为你应当在同一个命名空间中定义你的测量检验夹具和测量试验,倘诺你想她们是您的class的友元。
比如,假若要测量检验的代码如下所示:

namespace my_namespace {

class Foo {
  friend class FooTest;
  FRIEND_TEST(FooTest, Bar);
  FRIEND_TEST(FooTest, Baz);
  ...
  definition of the class Foo
  ...
};

}  // namespace my_namespace

Your test code should be something like:

namespace my_namespace {
class FooTest : public ::testing::Test {
 protected:
  ...
};

TEST_F(FooTest, Bar) { ... }
TEST_F(FooTest, Baz) { ... }

}  // namespace my_namespace
getPathInfo; if (!$path || !$this->pathWhiteList || !is_array) { return false; } foreach ($this->pathWhiteList as $item) { if (preg_match { return true; } } return false; } }

getProperty; $reflectedPathWhiteList->setAccessible; $reflectedPathWhiteList->setValue($webDefenderService, $pathProperty); $reflectedRequest = $reflectedClass->getProperty; $reflectedRequest->setAccessible; $reflectedRequest->setValue; $reflectedMethod = $reflectedClass->getMethod; $reflectedMethod->setAccessible; $this->assertEquals($result, $reflectedMethod->invoke; } public function additionProviderPathWhiteList() { $allPath = ['.*']; $checkPath = ['^auth/']; $authSendSmsRequest = new Request([], [], [], [], [], ['HTTP_HOST' => 'api.dev.com', 'REQUEST_URI' => '/auth/sendSms']); $indexRequest = new Request([], [], [], [], [], ['HTTP_HOST' => 'api.dev.com', 'REQUEST_URI' => '/']); $noMatchRequest = new Request([], [], [], [], [], ['HTTP_HOST' => 'api.dev.com', 'REQUEST_URI' => '/product/sendSms']); return [ 'index' => [[], $authSendSmsRequest, false], 'no request' => [$allPath, $indexRequest, false], 'all request' => [$allPath, $authSendSmsRequest, true], 'check auth sms' => [$checkPath, $authSendSmsRequest, true], 'check path no match' => [$checkPath, $noMatchRequest, false] ]; } }

九、Catching Failures

假使您要在Google测量试验之上构建测验实用程序,则需求测量检验你的实用程序。
你将动用什么框架来测量试验它? 谷歌测量试验,当然。

挑衅是验证您的测量检验实用程序是还是不是科学告知故障。
在框架中通过抛出极其报告退步,您能够捕获分外并预感。 但是GoogleTest不会采取拾贰分,那么大家如何测量试验一段代码是不是会发生预想的退步呢?

“gtest / gtest-spi.h”满含部分构造来变成这点。 #include
它,然后能够接纳

EXPECT_FATAL_FAILURE(statement, substring);​

to assert that statement generates a fatal (e.g. ASSERT_*) failure
whose message contains the given substring, or use

EXPECT_NONFATAL_FAILURE(statement, substring);​

if you are expecting a non-fatal (e.g. EXPECT_*) failure.

。。。。。//要求时再看

5. 代码覆盖率

十、Getting the Current Test’s Name

   一时二个函数大概需求掌握当前运作的测量检验的名号。
比如,您能够使用测验夹具的SetUp()方法根据正在运维的测量检验设置黄金文件名。
:: testing :: TestInfo类具备以下音信:

namespace testing {

class TestInfo {
 public:
  // Returns the test case name and the test name, respectively.
  //
  // Do NOT delete or free the return value - it's managed by the
  // TestInfo class.
  const char* test_case_name() const;
  const char* name() const;
};

}  // namespace testing

To obtain a TestInfo object for the currently running test,
call current_test_info() on the UnitTest singleton object:

// Gets information about the currently running test.
// Do NOT delete the returned object - it's managed by the UnitTest class.
const ::testing::TestInfo* const test_info =
  ::testing::UnitTest::GetInstance()->current_test_info();
printf("We are in test %s of test case %s.n",
       test_info->name(), test_info->test_case_name());

假诺没有运维测量试验,current_test_info()再次来到叁个空指针。
非常是,你无法在TestCaseSetUp(),TestCaseTearDown()中找到测验用例名称(在此你明白测验用例名称),可能从它们调用的函数。

标签:

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图