Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从单元测试自动生成类?

从单元测试自动生成类?

提问于 2018-02-02 00:10:58
回答 10关注 0查看 698

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

代码语言:javascript
运行
AI代码解释
复制
IPerson p = new Person();
p.Name = "Sklivvz";
Assert.AreEqual("Sklivvz", p.Name);

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

代码语言:javascript
运行
AI代码解释
复制
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,使用哪个库)?

回答 10

脸滚键盘dj

回答已采纳

发布于 2018-02-02 00:58:31

您需要的似乎是您的语言的解析器(Java),以及名称和类型解析器。(“符号表生成器”)。

在解析源文本之后,编译器通常有一个名称解析器,它试图记录名称及其对应类型的定义,以及一个类型检查器,用于验证每个表达式是否有一个有效类型。

通常,名称/类型解析器在找不到定义时会发出抱怨。您希望它做的是找到导致问题的“未定义”的东西,并推断出它的类型。

代码语言:javascript
运行
AI代码解释
复制
 IPerson p = new Person();

名称解析器知道没有定义“Person”和“IPerson”。如果是

代码语言:javascript
运行
AI代码解释
复制
 Foo  p =  new Bar();

没有任何线索表明您想要一个接口,只是foo是Bar的某种抽象父级(例如,类或接口)。因此,工具必须知道它是哪一个(“每当您找到这样的构造时,假设foo是一个接口...”)。您可以使用启发式方法:Ifoo和foo意味着Ifoo应该是一个接口,而且在某个地方必须有人将foo定义为实现该接口的类。一旦工具做出了这一决定,它就需要更新其符号表,以便能够转到其他语句:

代码语言:javascript
运行
AI代码解释
复制
 p.Name = "Sklivvz";

假设p必须是一个接口(根据前面的推断),那么name必须是一个字段成员,并且它的类型似乎是来自赋值的字符串。

在此基础上,声明:

代码语言:javascript
运行
AI代码解释
复制
 Assert.AreEqual("Sklivvz", p.Name);

名称和类型无需进一步解决。

IFoo和Foo实体的内容取决于您;您不必使用get和set,但这是个人品味。

如果在同一个语句中有多个实体,这就不太好用了:

代码语言:javascript
运行
AI代码解释
复制
 x = p.a + p.b ;

我们知道a和b可能是字段,但是如果它们确实是数字的,或者如果它们是字符串(在Java中是合法的,不知道C#),您就无法猜测它们是什么数字类型。对于C++,您甚至不知道“+”是什么意思;它可能是Bar类上的运算符。所以你要做的就是收集约束,例如,“a是一些不定数或字符串”等,当工具收集证据时,它缩小了一组可能的约束。(这就像那些词中的问题:“乔有七个儿子。杰夫比萨姆高。哈利不能躲在山姆后面。...杰夫的孪生兄弟是谁?“在那里你必须收集证据并排除不可能的可能性)。你还得担心你最终会遇到矛盾。

您可以排除p.a+P.B的情况,但这样就不能编写单元测试而不受惩罚。如果你想不受惩罚的话,有标准的约束求解者。(这是个概念)。

好的,我们有想法,现在,这能用实际的方式来做吗?

第一部分需要解析器和可弯曲的名称和类型解析器。您需要一个约束求解器,或者至少需要一个“定义值流到未定义值”操作(琐碎的约束解决程序)。

我们DMS软件重组工具图包与其Java前端很有可能会这么做。DMS是一个工具生成器的工具,对于那些想要构建以任意方式处理计算机语言的工具的人来说。(想想“用程序片段而不是数字计算”)。

DMS提供了通用的解析机制,可以为给定的任何前端(例如Java,还有C#前端)构建树。我之所以选择Java,是因为我们的Java前端拥有所有的名称和类型解析机制,并且它是以源代码形式提供的,因此可以弯曲。如果您坚持使用简单的约束解决程序,那么您可能会使用Java名称解析器来确定类型。DMS将允许您组装对应于代码片段的树,并将它们合并成更大的树;当您的工具为符号表收集事实时,它可以构建原始树。

在某个地方,你必须决定你已经完成了。在了解整个接口之前,工具需要查看多少个单元测试?(我想它吃掉了你提供的所有东西?)。完成后,它为各个成员组装片段,并为接口构建AST;DMS可以使用它的pretty打印机将该AST转换回源代码,如您所示。

我建议在这里使用Java,因为我们的Java前端有名称和类型解析。我们的C#前端没有。这是一个“纯粹”的野心问题;有人必须编写一个,但这是相当多的工作(至少对于Java和我无法想象C#是真的不同)。

但是这个想法在原则上使用DMS很好。

您可以使用其他基础结构来完成此操作,这些基础结构允许您访问解析器和可弯曲的名称和类型解析器。对于C#来说,这可能并不容易;我怀疑MS可能会给您提供一个解析器,并访问名称和类型解析,但无法更改它。也许莫诺就是答案?

您仍然需要一个WASS来生成代码片段并组装它们。您可能会尝试通过字符串黑客来实现这一点;我(长期)将程序比特粘合在一起的经验是,如果使用字符串,最终会使它变得一团糟。您确实需要表示已知类型的代码片段的片段,这些代码片段只能以语法允许的方式组合;DMS这样做不会造成混乱。

恩蕊儿

发布于 2018-02-02 10:06:10

我发现,每当我需要这样的代码生成工具时,我可能会编写一些代码,这些代码可能会变得更加通用,所以我只需要编写一次。在您的示例中,这些getter和setter似乎没有为代码添加任何值--实际上,它实际上只是断言C#中的getter/setter机制有效。

在了解编写这类测试的动机之前,我会避免编写(甚至是)这样的工具。

顺便说一下,看看纳贝哈斯

铁血之鹰

发布于 2018-02-02 08:57:46

VisualStudio附带了一些功能,在这里可以对你有所帮助:

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

那么在输入括号后,你可以:

  • Ctrl-。(打开智能标记)
  • ENTER (生成存根)
  • F12(进入定义,带您进入新方法)

只有当IDE认为没有匹配的方法时,才会出现智能标记。如果要在智能标记未打开时生成,可以转到编辑->IntelliSense->GenerateMethod Stub...

片段。小代码模板,使生成公共代码的比特变得容易。有些很简单(尝试"if[TAB][TAB]")。有些是复杂的(‘开关’将生成一个枚举的情况)。你也可以自己写。对于你的情况,尝试“类”和“道具”。

亦见“如何将“GenerateMethod Stub”更改为在VS中抛出NotImplementedException?“关于GMS上下文中的信息片段。

自动道具属性可以简单得多:

代码语言:javascript
运行
AI代码解释
复制
public string Name { get; set; }

创建类在解决方案资源管理器中,单击项目名称或子文件夹,选择加号->类键入新类的名称。按ENTER.您将在正确的命名空间中得到一个类声明,等等。

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

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

和开发者交流更多问题细节吧,去 写回答
相关文章
从类生成XML架构
要生成为同一XML命名空间中的多个类定义类型的完整架构,请使用%XML.Schema构建架构,然后使用%XML.Writer为其生成输出。
用户7741497
2022/07/05
1.2K0
从XML架构生成类
Studio提供了一个向导,该向导读取XML模式(从文件或URL),并生成一组支持XML的类,这些类对应于模式中定义的类型。 所有的类都扩展%XML.Adaptor。 指定一个包来包含类,以及控制类定义细节的各种选项。
用户7741497
2022/07/05
1.9K0
TestMe自动生成单元测试用例
最近有个公众号发了一篇《阿里内部如何做单元测试培训的》的文章,在文章的最后提到了TestMe这个自动生成单元测试用例的工具TestMe。
Antony
2023/03/23
4.4K0
TestMe自动生成单元测试用例
工具尝鲜--单元测试自动生成工具 evosuite
EvoSuite是由Sheffield等大学联合开发的一种开源工具,用于自动生成测试用例集,生成的测试用例均符合Junit的标准,可直接在Junit中运行。
测试开发社区
2020/07/15
3.2K0
IDEA 自动生成类图 UML
Alt + Shift + Command + U
一个会写诗的程序员
2019/12/11
3.2K0
UML类图自动生成,太爽了
转自:blog.csdn.net/hy_coming/article/details/80741717
猿天地
2020/09/23
23.9K0
UML类图自动生成,太爽了
Java 项目自动生成单元测试插件推荐
很多公司对分支单测覆盖率会有一定的要求,比如 单测覆盖率要达到 60% 或者 80%才可以发布。
明明如月学长
2021/12/05
12.6K0
Java 项目自动生成单元测试插件推荐
Wings-让单元测试智能全自动生成
单元测试是保证软件质量非常有效的手段,无论是从测试理论早期介入测试的理念来看或是从单元测试不受UI影响可以高速批量验证的特性,所以业界所倡导的测试驱动开发,这个里面提到的测试驱动更多的就是指单元测试驱动。但一般开发团队还是很少的系统化的执行单元测试,针对应用软件的测试更多是由专业测试团队来执行黑盒测试。单元测试的最大的难点不在于无法确定输入输出,这毕竟是模块开发阶段就已经定好的,而在于单元测试用例的编写会耗费开发人员大量的工时,按照相关统计单元测试用例的时间甚至会远超过功能本身开发的时间。以下是几个最常见的开发不写单元测试的理由:
顾翔
2019/12/11
2.2K0
Wings-让单元测试智能全自动生成
使用MyBatis Generator从数据库自动生成Mapper和Po类
本博客主要讲解如何使用自己的MyBatis Generator工程,实现数据库表到Mapper已经Po类的映射。程序下载地址:MyBatis反转 1.项目结构
geekfly
2022/05/06
7890
使用MyBatis Generator从数据库自动生成Mapper和Po类
自动生成实体类,哪个最佳?
看过松哥视频的小伙伴都知道,我个人习惯用一个名叫 MyBatis Generator 的逆向工具,利用这个工具我们自动生成实体类和 mapper 接口以及对应的 xml 文件,MyBatis Generator 是一个独立工具,你可以下载它的 jar 包来运行、也可以在 Ant 或者 maven 中配置插件运行。 大家在松哥公众号后台回复 mybatis-gen 有这个工具的下载链接。 虽然我一直用这个工具,但是总感觉它太有年代感了,用久了有点腻。所以很多时候看到公众号里有人推荐其他的 MyBatis 逆向
江南一点雨
2022/04/14
9100
自动生成实体类,哪个最佳?
PHP自动生成表单的Form类
<?php //Form.php class form { var $layout=true;//是否使用表格布局 var $action;//表单要提交到的URL va
用户7999227
2021/09/23
1.9K0
MyBatis-flex自动生成代码类
4xx.me
2023/08/24
8810
MyBatis-flex自动生成代码类
PHP自动生成表单的Form类
<?php //Form.php class form { var $layout=true;//是否使用表格布局 var $action;//表单要提交到的URL va
用户8983410
2021/09/22
2K0
IDEA自动在test包下生成junit单元测试文件
选中待测类,快捷键ctrl + shift + t,选择Create New Test 弹出对话框的下面member内勾选要测试的方法,点击ok
JavaEdge
2021/02/22
8850
IDEA自动在test包下生成junit单元测试文件
一款自动生成单元测试的 IDEA 插件
点击上方蓝色字体,选择“设为星标” 回复”学习资料“获取学习宝典   今天来介绍一款工具Squaretest,它是一款自动生成单元测试的插件,为什么会用到它? 主要因为最近公司上了代码质量管控的指标,会考评各个项目的单元测试覆盖率,以及sonar扫描出来的各种问题,很多老项目老代码,或者着急交付的项目,单元测试严重缺失,覆盖率只有5%不到。 所以几个小伙伴这几天就在疯狂的堆单元测试,3个人堆了2天才堆到30%,于是我也来上手帮忙写了两个,写到第二个的时候就发现,这个活不应该是人干的,要去看原来的代码,然
猿天地
2022/05/12
1.4K0
一款自动生成单元测试的 IDEA 插件
ChatGPT优秀插件汇总--插件自动生成单元测试代码实验
OpenAI的ChatGPT智能AI引擎,在全世界范围流行,各种ChatGPT应用场景也遍地开花。 问题回答、文章续写、代码审计、自动生成单体测试、木马生成等等,都可以实现。
糖果
2023/03/05
2.5K0
ChatGPT优秀插件汇总--插件自动生成单元测试代码实验
【后端】IntelliJ IDEA 快速自动生成 Junit 测试类
在 idea 中定位菜单到 File | Settings | Editor | File and Code Templates | Code,配置生成 Junit 的默认信息,我这里配置的是注释模板,如下:
框架师
2023/03/14
3K0
【后端】IntelliJ IDEA 快速自动生成 Junit 测试类
FlutterUnit 工具集录 | IconFont 类代码自动生成
首先介绍一下 FlutterUnit 中,代码生成菜单下的 IconFont 工具的作用。它主要解决Flutter 项目中自定义字体图标使用的问题:
张风捷特烈
2023/02/26
1.3K0
FlutterUnit 工具集录 |  IconFont 类代码自动生成
JsonPath工具类单元测试
上期文章讲到JsonPath工具类封装,遗留了一个坑,就是关于工具类的单元测试,由于中午得空,所以使用单元测试框架Spock写了一点点单元测试用例,分享出来,供大家参考。
FunTester
2020/09/08
1.1K0
点击加载更多

相似问题

如何单元测试抽象类?

21.5K

自动下载mpdf生成pdf文档?

21.3K

如何解决根目录自动生成imsdk文件?

33.9K

如何加固后自动生成多个渠道的包?

1544

PHP中自动加载类的最佳方法

2247
相关问答用户
某公司 | 程序员擅长1个领域
腾讯云TDP | 先锋会员擅长2个领域
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档