Chat Bot(聊天机器人)自动化测试脚本来解决人工测试的问题

问题描述:有一个Oliver Cafe Shop聊天机器人,如何实现自动化脚本自动测试这个聊天机器人的功能。

实现效果:通过代码来实现客户端发送请求来代替Bot Framework Emulator输入Tea,然后客户端监听和接收服务器端(Bot)发来的回复(图片中选择drinksubtype的卡片),最后根据服务器端(Bot)的回复再次发送请求(红茶)或者进行别的操作。

1.首先建立一个工程TestWebRequest,作为代替模拟器发送请求,具体实现函数代码如下,其中WriteLog在以前的博客中:这里

//Post请求的json格式的content的路径
public List<string> orderDrinkAllJsonPathList = new List<string> { "../../../Json/Order.json" };
public void OrderDrink(){WriteLog("Order Drink Begin.");try{foreach (string jsonPath in orderDrinkAllJsonPathList){string content = File.ReadAllText(jsonPath);string jsonPathName = jsonPath.Substring(jsonPath.LastIndexOf("/") + 1);HttpResponseMessage response = OrderDrinkOneStep(content, jsonPathName).Result;//HttpResponseMessage response = GetActivity(content, jsonPathName).Result;                    if (response != null && response.IsSuccessStatusCode){string responseContent = response.Content.ReadAsStringAsync().Result ?? "Empty";WriteLog("Order Drink " + jsonPathName + " successful:" + responseContent);//System.Threading.Thread.Sleep(3000 * timeCount * 3);Console.WriteLine("Order Drink " + jsonPathName + " successful:" + responseContent);}else if (response != null){WriteLog("Order Drink " + jsonPathName + " failed:" + "ReasonPhrase: " + response.ReasonPhrase);Console.WriteLine("Order Drink " + jsonPathName + " failed:" + "ReasonPhrase: " + response.ReasonPhrase);break;}}WriteLog("Order Drink End.");}catch (Exception ex){WriteLog("Order Drink " + " failed:" + "Exception: " + ex.Message);}}

具体的OrderDrink的每一个具体步骤只是request的content不一样,所以这样写进一个方法提高代码利用率

public async Task<HttpResponseMessage> OrderDrinkOneStep(string content, string errorJsonPath){            HttpResponseMessage response = null;//跳过证书认证,可以不用var httpClientHandler = new HttpClientHandler();httpClientHandler.ServerCertificateCustomValidationCallback = (message, cert, chain, error) => { return true; };using (HttpClient client = new HttpClient(httpClientHandler)){try{                    var requestObj = JsonConvert.DeserializeObject<Activity>(content);StringContent strContent = new StringContent(JsonConvert.SerializeObject(requestObj), Encoding.UTF8, "application/json");                    var request = new HttpRequestMessage(){RequestUri = new Uri(requestUrl),Method = HttpMethod.Post,Content = strContent};//本地创建bot不需要app auth认证,详细的在后面介绍//string token = GetMSAJWTToken("YourAppId", "YouAppPassword");//string authorization = "Bearer " + token;//request.Headers.Add("Authorization", authorization);                   response = await client.SendAsync(request);}catch (Exception e){string logContent = "RestoreFileOneStep" + "errorJsonPath " + errorJsonPath + "errorMessage: " + e.Message;WriteLog(logContent);}}return response;}

其中Order.json文件的内容如下,直接复制第一张图片里面的json文本即可,注意改一下serviceurl的端口号,后面会监听这个端口号(7777致敬一下clearlove哈哈哈哈哈哈)

{"channelData": {"clientActivityID": "15584188744740.9l71xdomgu6","state": "sent"},"channelId": "emulator","conversation": {"id": "C743EA22-CE36-4409-A38C-FD6FF99ECE1C|livechat"},"entities": [{"requiresBotState": true,"supportsListening": true,"supportsTts": true,"type": "ClientCapabilities"}],"from": {"id": "c9a42e69-b5fe-48c4-b24e-efdc50e6af34","name": "User","role": "user"},"id": "c5c38b50-7b8e-11e9-bcd2-17e98060b0ce","localTimestamp": "2019-05-21T14:07:54+08:00","locale": "en-us","recipient": {"id": "1","name": "Bot","role": "bot"},"serviceUrl": "http://localhost:7777","showInInspector": true,"text": "Tea","textFormat": "plain","timestamp": "2019-05-21T06:07:54.501Z","type": "message"
}

运行一下TestWebRequest,暂时把serviceUrl的端口号改回去,这样就会在模拟器上就会得到模拟器输入"Tea"相同的结果

2.创建一个项目Client来代码模拟器来监听服务器端(Bot)的回复请求

/// <summary>/// 应用程序的主入口点。/// </summary>[STAThread]static void Main(string[] args){            int recv;//用于表示客户端发送的信息长度                       string ipadd = "127.0.0.1";           int port = 7777;IPEndPoint ipep = new IPEndPoint(IPAddress.Parse(ipadd), port);Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);newsock.Bind(ipep);//绑定newsock.Listen(30);//监听Console.WriteLine("waiting for a client");Socket client = newsock.Accept();//当有可用的客户端连接尝试时执行,并返回一个新的socket,用于与客户端之间的通信IPEndPoint clientip = (IPEndPoint)client.RemoteEndPoint;Console.WriteLine("connect with client:" + clientip.Address + " at port:" + clientip.Port);           try{                while (true){//用死循环来不断的从客户端获取信息var data = new byte[client.ReceiveBufferSize];recv = client.Receive(data);if (recv == 0)//当信息长度为0,说明客户端连接断开break;string requestBody = System.Text.Encoding.Default.GetString(data);//得到服务器返回的内容,就可以继续进行后面的测试输入了//requestBody = requestBody.Substring(requestBody.IndexOf("{"));//Activity activity = JsonConvert.DeserializeObject<Activity>(requestBody);//TestBotRequest.WebRequest webRequest = new TestBotRequest.WebRequest();//webRequest.CreatePostActivity(activity);                                       }}catch (Exception ex){WriteLog(ex.Message);}Console.WriteLine("Disconnected from" + clientip.Address);client.Close();newsock.Close();Console.ReadKey();}

 3.启动bot,这里不用虚拟器打开bot,然后启动Client和TestWebRequest,就完成了一轮自动化脚本实现的对话了。这里VS创建的bot不需要app auth认证的,因为appid是空,其他部署到Azure需要认证的话需要在request的header加上token,token的具体获取方法如下,

public string GetMSAJWTToken(string clientId,string clientSecret){            var authendpoint = "https://login.microsoftonline.com/botframework.com/oauth2/v2.0/token";using (var client = new WebClient()){var values = new NameValueCollection();values["grant_type"] = "client_credentials";values["client_id"] = clientId;values["client_secret"] = clientSecret;values["scope"] = clientId + "/.default";var response = client.UploadValues(authendpoint, values);var responseString = Encoding.Default.GetString(response);var result = JsonConvert.DeserializeObject<MSAResponse>(responseString);return result.Access_Token;               }}

4.具体源代码:这里

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/59896.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

postman发送需要登录验证的请求

使用postman 发送后台需要登录验证的请求 postman需要填写的参数 Authorization的获取方式 打开前台发送一个成功的请求 找到里面的Authorization粘贴到postman参数那里就可进行请求了

Postman发送请求时带上登录信息

正常情况下&#xff0c;没有登录验证等公共接口&#xff0c;用postman进行get或post请求都很方便&#xff0c;加上相应的参数就行。 但是对于某些接口&#xff0c;可能需要先登录后才能请求&#xff0c;这时如果按正常的思路请求&#xff0c;可能就会被拦截了。 对于这种情况…

避免跳出谷歌人机验证 reCAPTCHA界面的解决方法

第一次遇到跳出谷歌人机验证 reCAPTCHA界面只要点击窗口就没有问题了&#xff0c;心里还感叹了下谷歌能把人机验证这事做的这么好&#xff0c;不错。然而这个窗口还是会不断调出来扰人 &#xff0c;导致使用Chrome浏览器搜索变得很慢&#xff0c;体验感极速下降&#xff0c;非常…

postman 请求时提示需要登录解决方案

在postman中没有输入登入信息时会遇到下面的提示。 只需在游览器控制台中 network 找到对应的请求&#xff0c; 在其中找到有关 Authority 的 Request Headers &#xff0c;将其复制 粘贴到postman中 再次执行&#xff0c;结果成功。

postman 登录--先获取到短信验证码,然后短信验证码的返回值作为登录接口的某一个请求值

业务场景&#xff1a;使用postman完成登录&#xff0c;先从一个接口获取到验证码&#xff0c;然后登录接口调用这个验证码 1.先写获取到验证码这个接口&#xff0c;返回的结果如下&#xff0c;我需要获取到data的值 2.然后需要把这个data返回的值设置成变量 //把data的值打…

使用postman完成需要发送验证码的会员注册请求

目标&#xff1a; 使用postman完成移动端的会员注册功能。 背景&#xff1a; 移动端会员注册时需要输入验证码&#xff0c;才能完成注册。 PC管理端有短信发送历史页面&#xff0c;能查询到注册时发送的验证码&#xff0c;验证码格式如下&#xff1a; [ uat_AutoTest ] 尊敬的用…

【异常解决】postman请求提示Full authentication is required to access this resource

Full authentication is required to access this resource解决方案 一、背景描述二、解决方案 一、背景描述 在使用 postman 测试接口时&#xff0c;该接口需要在 Header 中传入 access_token&#xff0c;实际上也在请求的 Header 中添加上了 access_token 参数&#xff0c;但…

请求后端返回的验证码显示的情况

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、情况一&#xff1a;数据是图片文件流二、情况二&#xff1a;直接返回是图片情况三&#xff1a;uni小程序的登录验证 最后 前言 在实际的项目中验证码登录几…

postMan 测试显示验证码

在postman的选项卡Test中&#xff0c;可以编写html格式的显示模板&#xff0c;在格式化显示时&#xff0c;变量使用的方式是两个大括号包着一个变量名{{变量名}}。 现在后端返回到前端的数据格式 一般是JSON格式&#xff0c;所以编写测试脚本要先把JSONW文本转换为JSON对象&am…

UNIX 工作站的大规模灭绝

行业快速迭代下&#xff0c;软硬件的淘汰速度似乎远超我们的想象。 链接&#xff1a;https://www.osnews.com/story/135605/the-mass-extinction-of-unix-workstations/ 声明&#xff1a;本文为 CSDN 翻译&#xff0c;未经允许禁止转载。 作者 | Thom Holwerda 译者 | 弯月…

【计算机网络】| Http.*协议该知道的那些事儿 | 面经

本文章参考了很多文档文献整理成狮子自己喜欢的风格类型文字&#xff0c;主要有&#xff1a; 《图解网络-小林coding》、Github上面的《前端语音社群》&#xff0c;ChatGpt 3.5 大家有兴趣可以去找来看看&#xff0c;一起上岸&#xff01;&#xff01;&#xff01; 目录 面试官…

GPT-3问答机器人实战【LangChain】

原文&#xff1a;https://www.toutiao.com/article/7211527561673867779/?log_frome0e756d2bfaf5_1683079005521 ChatGPT 几个月前问世&#xff0c;并以其回答来自广泛知识集的问题的能力震惊了所有人。 在 ChatGPT 展示大型语言模型的强大功能时&#xff0c;Dagster 核心团队…

三秒钟,我要拿到世界杯所有队伍阵容信息

文章目录 &#x1f550;Im coming~&#x1f551;我写了个啥&#xff1f;&#x1f554;咋写的&#xff1f;&#x1f558;代码供上&#x1f55b; See you next time 专栏Python零基础入门篇&#x1f525;Python网络蜘蛛&#x1f525;Python数据分析Django基础入门宝典&#x1f52…

2022世界杯结果预测,简单AI模型最有效?附代码!

2022世界杯冠军是谁&#xff1f;本文将为你揭晓一个利用简单AI模型得到的靠谱预测。 许多人称足球为“不可预测的比赛”&#xff0c;因为一场足球比赛有不同的因素可以改变最终比分。 这是真的……在某种程度上。 北大出版社&#xff0c;人工智能原理与实践 人工智能和数据科…

我在chatgpt学习requestIdleCallback

react对接chatgpt&#xff0c;导入json形成记忆数据继续提问&#xff0c;想要私聊 [{"role": "user","content": "requestIdleCallback 怎么使用" }, {"role": "assistant","content": "requestI…

必应聊天放宽限制:每轮会话最多 30 次,每天上限提至 300 次

微软搜索和人工智能副总裁 Jordi Ribas 在最新推文中宣布&#xff0c;必应聊天&#xff08;Bing Chat&#xff09;进一步放宽限制&#xff0c;每轮会话最多支持 30 次&#xff0c;用户每天最多可进行 300 次交流。 必应聊天预览版在最初发布时没有任何关于每次会话或每天聊天次…

前端食堂技术周刊第 76 期:第 95 次 TC39 会议、React Labs 工作进展、加速 JavaScript 生态系统、设计系统元规范、AI 一周资讯、前端开发者的终局

美味值&#xff1a;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f; 口味&#xff1a;惠林顿牛排 食堂技术周刊仓库地址&#xff1a;https://github.com/Geekhyt/weekly 本期摘要 第 95 次 TC39 会议React Labs 工作进展AI 一周资讯加速 JavaScript 生…

直播APP制作时即时聊天功能实现

目前直播app制作很火&#xff0c;直播中的即时聊天功能必不可少。云豹直播作为优质的直播平台源码提供商&#xff0c;在即时聊天功能方面必有其独到之处&#xff0c;下面为大家从如何实现即时聊天这个功能上答疑解惑。 即时聊天这个需求在很多app中都有&#xff0c;也是公认的…

虚拟直播实现流程(多人连麦直播互动为例)

虚拟直播既可以实现单人视频直播&#xff0c;也可以邀请观众上麦、进行多人连麦互动。 虚拟直播场景的直播分为两个阶段&#xff1a; 单虚拟主播直播&#xff1a; 单虚拟主播直播是指主播创建房间后&#xff0c;使用虚拟形象进行音视频直播&#xff0c;观众可以进房观看直播。…

AWS 使用ivs chat 实现直播聊天功能

什么是IVS Chat Rooms Amazon IVS Chat 是一种可扩展的流式聊天功能&#xff0c;具​​有内置的审核选项&#xff0c;旨在伴随实时流式视频。通过 IVS Chat&#xff0c;观众可以通过提问和参与讨论来建立社区关系。IVS Chat 提供房间资源管理和用于发送、接收和审核聊天消息的…