gpt4 book ai didi

visual-studio-2008 - C++/CLI 中返回语句的部分覆盖

转载 作者:行者123 更新时间:2023-12-04 06:53:30 27 4
gpt4 key购买 nike

我有 C++/CLI 代码,我使用的是 Visual Studio 2008 Team Suite Code Coverage。

代码头:

// Library.h

#pragma once

#include <string>

using namespace System;

namespace Library
{
public ref class MyClass
{
public:
static void MyFoo();
static std::string Foo();
};
}

代码实现:
#include "Library.h"

using namespace Library;
using namespace System;

void MyClass::MyFoo()
{
Foo();
}

std::string MyClass::Foo()
{
return std::string();
}

我有一个 C# 单元测试,调用 MyClass.MyFoo() :
[TestMethod]
public void TestMethod1()
{
Library.MyClass.MyFoo();
}

出于某种原因,我没有获得 MyClass 的完整代码覆盖率。 . Foo() 方法有 3 个未覆盖的块和 5 个覆盖的块。右花括号 ( } ) 以橙色标记 - 部分被覆盖。我不知道为什么它被部分覆盖而不是完全覆盖,这是我的问题。

MyClass Code Coverage Print Screen http://img217.imageshack.us/img217/7664/myclasscoverage.png

更新

另一个例子:

标题:
// Library.h

#pragma once

using namespace System;

namespace Library
{
struct MyStruct
{
int _number;
};

public ref class MyClass
{
public:
static void MyFoo();
static MyStruct* Foo();
};
}

执行:
#include "Library.h"

using namespace Library;
using namespace System;

void MyClass::MyFoo()
{
delete Foo();
}

MyStruct* MyClass::Foo()
{
return new MyStruct();
}

我仍然在 Foo 的 return 中得到相同的缺失报道陈述。

最佳答案

您没有涵盖函数通过异常而不是正常退出的情况。当然,如果你甚至不能构造一个零长度 std::string那么您的程序可能已经无法恢复,但确定这超出了代码覆盖率分析的范围。

编辑:为了提高覆盖率,您可以模拟一个全局 operator new它基于某些全局标志(或更灵活地,在第 N 个分配时失败)而失败,您可以在测试用例中设置这些标志。

例如

int allocation_failure = 0;
void* operator new(size_t requestedbytes)
{
if (allocation_failure) {
if (!--allocation_failure) {
throw std::bad_alloc();
}
}
void* retval = malloc(requestedBytes);
if (!retval) {
throw std::bad_alloc();
}
return retval;
}

void operator delete(void* p)
{
if (p) free(p);
}

或者,您可以有条件地使特定大小的分配失败,或特定大小的第 N 个分配等失败,以通过您的代码执行所有可能的路径。

关于visual-studio-2008 - C++/CLI 中返回语句的部分覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2789842/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com