繁体   English   中英

测试课程

[英]testing classes

我昨天整理了一堂课,做了一些有用的工作。 我开始进行alpha测试,并且在某些时候意识到我正在为类本身添加与alpha测试相关的方法。 它打击了我,他们不属于那里。 在经过一些努力之后,我从基类中派生了一个测试类,该类也可以访问受保护的成员。 我把所有与测试相关的方法,并在测试类中设置和拆除,并使基类倾斜,并且正如俗话所说的那样。

在这里浏览了一段时间后,我发现一条评论建议使用这种技术,使测试类成为真正的类的朋友。

回想起来,这些技术对我来说应该是显而易见的。

我正在寻找的是专门的alpha测试/单元测试类的技术,而不会增加被测试类的重量。

您个人使用了哪些技巧并推荐?

to your classes. 单元测试的目标之一是验证类的 这意味着,一般来说,你不应该测试你班上肮脏的内脏。 单元测试应该与您的类的公共输入和输出交互,并验证行为是否符合预期。 因此,您可以更改类的内部实现,而不会影响依赖于它的所有其他对象。 显然,我不知道你情况中的细节,但我会说,作为一般规则,如果你的单元测试试图找出课堂的私人细节,那你就做错了。

编辑:另见: 这个问题 请注意,它可以完成(最佳答案),但也注意到第二位的答案(短边)与我上面提到的或多或少相同。

听起来你不想要单元测试,这正是一个类接口工作的验证。 你不应该为了进行单元测试而改变你的课程。 如果您正在寻找一种方法来验证对象的内部状态以使其保持一致,那么您应该查看“ 按合同设计”方法,该方法可以验证对象内部的状态。

那些都很好。 我通常也希望测试类不仅是原始的,而且是完全不同的DLL / EXE,以及从编译它的“真正的”DLL / EXE中测试“真正的”编译类。 。

我发现的另一种技术是在测试工具中重新定义类。 完全复制类定义,但将所有内容都公开。 这允许测试工具对类进行“白盒”访问,但实际的实现仍然来自真正的类代码。

class myClass
{
private:
    int foo;
public:
    myClass() { foo = 0; }
}

接着:

class test_myClass
{
public:
    int foo;
public:
    test_myClass();
};

void test()
{
    myClass *c = new myClass();
    test_myClass *t = (test_myClass*)c;
    // All methods are called on c.
    // White-box access is available through t.
};

哦......而DevStudio 2008现在有一些非常酷的单元测试功能,包括声明一个'朋友' 程序集的功能 ,它允许白盒访问正在测试的程序集中的所有内部类。

我做了很多框架构建 - 基本上调用我想测试的类/接口。 班上没有额外的工作。

我还建了几次类,使公共方法变得虚拟。 我从那些派生出来并制作了测试类/对象。 测试对象方法称为父(真实类)方法,并记录所有调用和结果。 对于日志记录而言,这比测试更多,但它也有效。

在关于单元测试之类的所有宣传之前,我做了上述方法。 (大约1990年代后期)

那时它对我来说效果很好,但是我对Junit / nunit的东西并没有做太多的事情,并且我真的很想让它们在实际项目上发挥作用。

一种方法的样本

上课

{...

public:virtual DoStuff(); ..};

ThingTest:public Thing

{

虚拟DoStuff()

{

//记录呼叫和参数。

//拨打父母

//记录返回值

//返回返回值

}

};

eJames是正确的单元测试需要关注接口,即类的输入产生正确的输出。 任何私有或朋友变量都是实现的一部分,未经过特定测试。

如果您在类的私有例程中出错,那么它将显示错误的输出。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM