- VisualStudio2022插件的安装及使用-编程手把手系列文章
- pprof-在现网场景怎么用
- C#实现的下拉多选框,下拉多选树,多级节点
- 【学习笔记】基础数据结构:猫树
大家好,我是Edison.
本篇我们基于上一篇的基础,来写一个单元测试助手的prompt,让它帮我们写一些我们.NET开发者不太愿意编写的单元测试代码,进而提高我们的代码质量,同时还降低我们的开发工作量.
这里我们基于上一篇中提到的万能语言辅助专家的提示词,稍作修改,形成我们的单元测试助手的提示词,如下所示,经过一些测试在GPT4-o模型下效果真的不错,建议收藏! 。
初始回复:“ **Hi I'm Unit Test Master,Created by Edison Zhou,V1.0,20230701** ### ⚙️ Preferences: - 🌍 lang: <> else C# - ⏲️ test: <> else xUnit - 🎯 mock: <> else Moq ### 🤖 Menu: 请使用表格输出支持的`instructions`和对应名称,不需要解释具体含义,也不需要显示这句话: --- 请指出你的开发语言,E.g.:/lang C#。 回复1保持默认。 ” `preferences` /lang:<开发语言偏好,默认为C#> /test:<测试框架偏好,默认为xUnit> /mock:<模拟框架偏好,默认为Moq> `instructions` /models:被测试代码涉及到的模型定义 用户输入一些被测试代码涉及到的Models如Entity,DTO, VO等,请按以下模版输出Models相关信息: ## 📝Models: 用表格输出:**Model Name** /constants:被测试代码涉及到的常量或枚举定义 用户输入一些被测试代码涉及到的Constants如Enum,Constant等,请按以下模版输出Constants相关信息: ## 📝Constants: 用表格输出:**Constant Name** /refer: 被测试代码依赖的的对象接口定义 用户输入一些被测试代码涉及到的对象接口如Repository,Gateway等,请按以下模版输出References相关信息: ## 📝Refers: 用表格输出:**Reference Name** /method:被测试方法的实际代码 结合之前的models,constants,refers定义,直接生成被测试方法的单元测试,无需再用表格输出相关信息。如果还有其他要求,用户会补充告诉你。 /help:输出支持的指令指引 `rules` - 请使用用户设置的偏好的开发语言、测试框架和模拟框架实现 - 每个单元测试方法的命名请遵循格式:"被测试方法名_测试场景_预期结果" - 假如被测试方法中有try-catch,请考虑针对catch部分也编写单元测试用例 - 请一步一步思考,不需要解释代码,如果有错误,用户会纠正你
假设我们有一个基于.NET开发的API项目,想要对其中某个Service的某个方法写写单元测试,我们只需要按照以下步骤即可生成可能会“一把过”的单元测试代码.
在我们的实践中,最好通过VS Code将上述的人设prompt编辑好,同时把下面需要喂给GPT的代码片段也准备好.
直接回复1,即保持C#+xUnit+Moq的框架组合,默认偏好设置
例如下所示,如果model有继承一些接口或基类,最好也一起告诉GPT.
/models public class AppTokenVo: VoBase, IVo { public string TokenName { get; set; } public AppNamesapce Namespace { get; set; } public AppTokenType Type { get; set; } public string Remark { get; set; } public DateTime ExpireTime { get; set; } } public class VoBase : IIdentity<Guid> { public virtual Guid Id { get; set; } } public class AppTokenEntity : EntityBase, IEntity { ...... } ......
例如下所示,如果constant有继承一些接口或基类,最好也一起告诉GPT.
/constants public enum AppStatusCode { ...... //// +++++++++++++++++++++++++++++++++++++ //// Common error codes [-1..-99] //// +++++++++++++++++++++++++++++++++++++ UnexpectedException = -1, OperationFinishedWithErrors = -2, ValidationFailed = -3, CouldNotSaveEntityInDb = -4, EntityNotFoundInDb = -5, EntityAlreadyExistInDb = -6 } ......
例如下所示,如果被依赖的对象有继承一些接口或基类,最好也一起告诉GPT.
/refers public interface IOperationResult<out T> where T : class { int StatusCode { get; } string ErrorMessage { get; } T Content { get; } bool HasContent { get; } bool IsSuccess { get; } } public interface IAppTokenRepository : IEfCoreRepositoryBase<AppTokenEntity> { } public interface IEfCoreRepositoryBase<TEntity> where TEntity : EntityBase, IEntity { Task<IEnumerable<TEntity>> GetAllAsync(Expression<Func<TEntity, bool>> predicate, bool asNoTracking = true); Task<TEntity> GetAsync(Guid id, bool asNoTracking = false); Task<TEntity> GetAsync(Expression<Func<TEntity, bool>> predicate, bool asNoTracking = false); Task<PagedEntityResult<TEntity>> GetPagedDataAsync(Expression<Func<TEntity, bool>> predicate, int limit, int skip); Task<PagedEntityResult<TEntity>> GetPagedDataAsync(Expression<Func<TEntity, bool>> predicate, string orderField, bool orderByAsc, int limit, int skip); TEntity Add(TEntity entity); TEntity Update(TEntity entity); TEntity Delete(TEntity entity); }
例如下所示,最好将该service的定义和构造函数也一起告诉GPT,可以将该service的其他方法移除掉再告诉GPT,让其保持专注.
当然,这也是我们为什么需要通过编辑器将其编辑好,再统一发给GPT的原因.
/method public class AppTokenService : AppServiceBase<AppTokenService>, IAppTokenService { public AppTokenService( IAppUnitOfWork unitOfWork, IMapper mapper, ILogger<AppTokenService> logger) : base(unitOfWork, mapper, logger) { } public async Task<IOperationResult<IEnumerable<AppTokenVo>>> GetAllAppTokensAsync() { Logger.LogInformation(LoggingConstants.FunctionCalled, nameof(AppTokenService), nameof(GetAllAppTokensAsync)); try { ...... return OperationResult<IEnumerable<AppTokenVo>>.Success(appTokens); } catch (Exception ex) { Logger.LogError(ex, LoggingConstants.Exception, nameof(AppTokenService), nameof(GetAllAppTokensAsync)); return OperationResult<IEnumerable<AppTokenVo>>.Error((int)AppStatusCode.UnexpectedException); } finally { Logger.LogInformation(LoggingConstants.FunctionFinished, nameof(AppTokenService), nameof(GetAllAppTokensAsync)); } } }
随后,GPT就会输出一些高质量的单元测试代码,你可以将其复制出来做一些验证:
(1)首先看看有没有编译错误,如果有,那一定是GPT虚构了某些依赖对象的接口定义,换言之,你忘记告诉GPT准确的定义了,因此你需要补充告诉GPT.
(2)其次如果没有编译错误了,那么恭喜你,你基本可以得到一个全部Pass的结果。但是,请再次review一下它的Assert有没有满足你的需求,如果没有,请一定反馈给GPT,按照你的需求做一些完善.
(3)最后建议跑一下代码覆盖率,看看还有没有没有覆盖的分支语句和代码行,然后反馈给GPT,直到满足你的需求再结束,比如Line Coverage和Branch Coverage都达到了80%及以上.
最后,你可能会发现你这么准备下来,可能自己手写单元测试也差不多写完了,但是这毕竟是你第一次调教GPT帮你写单元测试,当你熟悉这个套路之后,有了自己的固定模板,以后的单元测试就会越来越快,而且你几乎不需要写一行代码了,是不是很酷?
本篇,我们了解了如何基于ChatGPT中的参数化表达沟通,实现一个可以帮我们开发者编写单元测试代码的单元测试助手。当然,这个Prompt我们的参数化设置,我们还可以将其用于C#之外的其他编程语言和测试框架,只要你愿意,你可以根据本文中的模板去修改和完善.
本文示例大模型版本:gpt4-o 。
作者:周旭龙 。
出处:https://edisonchou.cnblogs.com 。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接.
最后此篇关于ChatGPT学习之旅(8)单元测试助手的文章就讲到这里了,如果你想了解更多关于ChatGPT学习之旅(8)单元测试助手的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我获得了一些源代码示例,我想测试一些功能。不幸的是,我在执行程序时遇到问题: 11:41:31 [linqus@ottsrvafq1 example]$ javac -g test/test.jav
我想测试ggplot生成的两个图是否相同。一种选择是在绘图对象上使用all.equal,但我宁愿进行更艰巨的测试以确保它们相同,这似乎是identical()为我提供的东西。 但是,当我测试使用相同d
我确实使用 JUnit5 执行我的 Maven 测试,其中所有测试类都有 @ExtendWith({ProcessExtension.class}) 注释。如果是这种情况,此扩展必须根据特殊逻辑使测试
在开始使用 Node.js 开发有用的东西之前,您的流程是什么?您是否在 VowJS、Expresso 上创建测试?你使用 Selenium 测试吗?什么时候? 我有兴趣获得一个很好的工作流程来开发我
这个问题已经有答案了: What is a NullPointerException, and how do I fix it? (12 个回答) 已关闭 3 年前。 基于示例here ,我尝试为我的
我正在考虑测试一些 Vue.js 组件,作为 Laravel 应用程序的一部分。所以,我有一个在 Blade 模板中使用并生成 GET 的组件。在 mounted 期间请求生命周期钩子(Hook)。假
考虑以下程序: #include struct Test { int a; }; int main() { Test t=Test(); std::cout<
我目前的立场是:如果我使用 web 测试(在我的例子中可能是通过 VS.NET'08 测试工具和 WatiN)以及代码覆盖率和广泛的数据来彻底测试我的 ASP.NET 应用程序,我应该不需要编写单独的
我正在使用 C#、.NET 4.7 我有 3 个字符串,即。 [test.1, test.10, test.2] 我需要对它们进行排序以获得: test.1 test.2 test.10 我可能会得到
我有一个 ID 为“rv_list”的 RecyclerView。单击任何 RecyclerView 项目时,每个项目内都有一个可见的 id 为“star”的 View 。 我想用 expresso
我正在使用 Jest 和模拟器测试 Firebase 函数,尽管这些测试可能来自竞争条件。所谓 flakey,我的意思是有时它们会通过,有时不会,即使在同一台机器上也是如此。 测试和函数是用 Type
我在测试我与 typeahead.js ( https://github.com/angular-ui/bootstrap/blob/master/src/typeahead/typeahead.js
我正在尝试使用 Teamcity 自动运行测试,但似乎当代理编译项目时,它没有正确完成,因为当我运行运行测试之类的命令时,我收到以下错误: fatal error: 'Pushwoosh/PushNo
这是我第一次玩 cucumber ,还创建了一个测试和 API 的套件。我的问题是在测试 API 时是否需要运行它? 例如我脑子里有这个, 启动 express 服务器作为后台任务 然后当它启动时(我
我有我的主要应用程序项目,然后是我的测试的第二个项目。将所有类型的测试存储在该测试项目中是一种好的做法,还是应该将一些测试驻留在主应用程序项目中? 我应该在我的主项目中保留 POJO JUnit(测试
我正在努力弄清楚如何实现这个计数。模型是用户、测试、等级 用户 has_many 测试,测试 has_many 成绩。 每个等级都有一个计算分数(strong_pass、pass、fail、stron
我正在尝试测试一些涉及 OkHttp3 的下载代码,但不幸失败了。目标:测试 下载图像文件并验证其是否有效。平台:安卓。此代码可在生产环境中运行,但测试代码没有任何意义。 产品代码 class Fil
当我想为 iOS 运行 UI 测试时,我收到以下消息: SetUp : System.Exception : Unable to determine simulator version for X 堆
我正在使用 Firebase Remote Config 在 iOS 上设置 A/B 测试。 一切都已设置完毕,我正在 iOS 应用程序中读取服务器端默认值。 但是在多个模拟器上尝试,它们都读取了默认
[已编辑]:我已经用 promise 方式更改了我的代码。 我正在写 React with this starter 由 facebook 创建,我是测试方面的新手。 现在我有一个关于图像的组件,它有
我是一名优秀的程序员,十分优秀!