代码之家  ›  专栏  ›  技术社区  ›  brickner

C++语句中的部分语句覆盖

  •  2
  • brickner  · 技术社区  · 15 年前

    代码头:

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

    我在福的保险单上还是一样的 return 声明。

    2 回复  |  直到 15 年前
        1
  •  2
  •   Ben Voigt    15 年前

    您没有涉及函数通过异常而不是正常退出的情况。当然,如果你连一个零长度的 std::string 那么您的程序对于恢复来说可能已经走得太远了,但是确定这一点超出了代码覆盖率分析的范围。

    operator new

    例如

    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次分配失败,等等,以在代码中执行所有可能的路径。

        2
  •  1
  •   Chris Schmich    15 年前

    尝试针对发布版本而不是调试版本收集代码覆盖率。

    编译器可以发出在应用某些优化/转换之后实际上无法访问的IL。最简单的方法就是用ildasm或反射器观察IL。看到了吗 here