从单元测试自动生成类?

时间:2020-03-06 14:20:46  来源:igfitidea点击:

我正在寻找可以进行单元测试的工具,例如

IPerson p = new Person();
p.Name = "Sklivvz";
Assert.AreEqual("Sklivvz", p.Name);

并自动生成相应的存根类和接口

interface IPerson         // inferred from IPerson p = new Person();
{
    string Name 
    { 
        get;              // inferred from Assert.AreEqual("Sklivvz", p.Name);
        set;              // inferred from p.Name = "Sklivvz";
    }
}

class Person: IPerson     // inferred from IPerson p = new Person();
{
    private string name;  // inferred from p.Name = "Sklivvz";

    public string Name    // inferred from p.Name = "Sklivvz";
    {
        get
        {
            return name;  // inferred from Assert.AreEqual("Sklivvz", p.Name);
        }
        set
        {
            name = value; // inferred from p.Name = "Sklivvz";
        }
    }

    public Person()       // inferred from IPerson p = new Person();
    {
    }
}

我知道ReSharper和Visual Studio会执行其中的一些操作,但是我需要一个完整的工具-命令行或者其他工具-可以自动推断需要完成的工作。
如果没有这样的工具,我们将如何编写(例如,使用哪些库从头开始扩展ReSharper)?

解决方案

我发现,每当需要这样的代码生成工具时,我可能都在编写可能变得更加通用的代码,因此只需要编写一次即可。在示例中,实际上这些getter和setter似乎并没有为代码增加任何价值,它实际上只是在断言Cworks中的getter / setter机制。

在了解编写此类测试的动机是什么之前,我将避免编写(甚至使用)这样的工具。

顺便说一句,我们可能想看看NBehave?

如果我们打算编写自己的实现,则绝对建议我们看一下NVelocity(C#)或者Velocity(Java)模板引擎。

我以前在代码生成器中使用过这些工具,并且发现它们使工作变得更加容易。

当我只需要一个简单的存根时,就使用Rhino Mocks。

http://www.ayende.com/wiki/Rhino+Mocks+-+Stubs.ashx

Visual Studio附带了一些功能,可以在这里为我们提供帮助:

生成方法存根。当我们编写对不存在的方法的调用时,我们会在方法名称上得到一个小小的智能标记,我们可以使用该标记根据传递的参数生成方法存根。

如果我们是键盘手(我是),那么在输入右括号后,我们可以执行以下操作:

  • Ctrl-。 (打开智能标签)
  • ENTER(生成存根)
  • F12(进行定义,以带我们进入新方法)

仅当IDE认为没有匹配的方法时,才显示智能标记。如果要在智能标记未启动时生成,则可以转到"编辑"->"智能感知"->"生成方法存根"。

片段。小型代码模板,可轻松生成通用代码。有些很简单(尝试" if [TAB] [TAB]")。有些比较复杂("开关"会产生枚举的情况)。我们也可以编写自己的。对于情况,请尝试" class"和" prop"。

另请参阅"如何更改VS中的Generate Method Stub以引发NotImplementedException?"在GMS中获取信息摘要。

汽车道具。请记住,属性可以简单得多:

public string Name { get; set; }

创建课程。在解决方案资源管理器中,R单击项目名称或者子文件夹,选择添加->类。输入新课程的名称。按下ENTER键。我们将在正确的名称空间中获得类声明,等等。

实现接口。当我们希望类实现接口时,编写接口名称部分,激活智能标记,然后选择任一选项为接口成员生成存根。

这些并不是我们要找的100%自动化解决方案,但是我认为这是一个很好的缓解方法。

我喜欢DevExpress的CodeRush。他们有一个巨大的可定制的模板引擎。对我来说,最好的是没有对话框。它们还具有从不存在的接口创建方法和接口以及类的功能。

令人惊讶的是,没有人真正对我们要问的问题给予任何帮助。

我不知道答案,但是我会考虑一下。

如果我自己尝试编写类似的内容,我可能会看到有关Resharper插件的信息。我之所以这样说,是因为正如我们所说的,resharper可以做到这一点,但是要分步骤进行。因此,我将编写一行一行并应用链接在一起的适当的reshaper创建方法的内容。

现在,我什至不知道该怎么做,因为我从来没有为过急的事情做任何事情,但这就是我会尝试做的。从逻辑上讲可以做到。

如果确实编写了一些代码,请张贴它,因为我也发现它很有用,因为它能够一步一步生成整个框架。很有用。

至少在理论上是可行的。我要做的是使用csparser之类的东西来解析单元测试(不幸的是,我们无法编译它),然后从那里获取。我可以看到的唯一问题是,就方法论而言,我们正在做的事情是错误的,从实体类生成单元测试(实际上是Visual Studio正是这样做)比其他方法更有意义。

尝试查看Pex,这是一个有关单元测试的Microsoft项目,该项目仍在研究中

research.microsoft.com/en-us/projects/Pex/