新社区网站

通常,你会在正确的地方,但我们最近推出了一个全新的社区网站……为社区,受社区。

耶……带我去社区!

社区博客是社区成员的个人观点,绝不是DNN公司或DNN平台的官方立场。这是一个表达个人对DNNPlatform、社区及其生态系统的想法的地方。你有什么有用的信息想要与DNN社区分享吗?如果有,请联系

社区博客的使用由我们的社区博客指南-请在评论或发布之前阅读。


DNN单元/集成测试-第3部分

12月 22

介绍

这是第三篇文章,指导那些想为DNN平台做贡献的人如何编写测试。在本文中,我将对前面的文章(第1部分第2部分),并向您展示如何开始添加新的测试特性。我将以一些社区成员贡献的真实代码为基础进行测试。

为什么要进行集成测试

由于DNN代码的某些部分是多年来编写的,因此可能无法编写单元测试,因为它需要大量的存根和模拟,甚至在某些情况下根本不可能。因此,我们需要编写在实际安装的DNN站点和SQL服务器数据库上运行的集成测试。

DNN创建了一个小框架,通过提供实用工具和辅助类来方便地创建用户,以这些用户的身份登录和调用WEB API方法等。这些库帮助程序被打包为NuGet包,并发布到DNN包的公共提要中在这里

此外,集成测试通常不需要编写模拟或存根,这使得编写集成测试在这方面更简单,但必须处理其自身的不同关注点,例如会话和其他关注点,这使得测试在编码时变得更大。他们只需要设置测试场地的适当值;例如,网站的URL,数据库的连接,任何与网站相关的应用程序设置。这些通常被添加到测试项目的“App.config”文件中。

添加您的第一个集成测试

在下面的讨论中,我将向您展示如何将集成测试添加到现有的平台代码库中。我将引导您通过发送请求、验证响应和检查数据库中的结果,为“MemberDirectoryController.cs”WEB API方法创建几个测试。与第2部分中的测试不同,这些实践测试没有与Jira和Github关联的拉取请求。

要执行WEB API请求,您要么需要源代码来查找随请求传递的参数名称和类型,要么需要使用一些工具来检查网络上的有线消息。浏览器工具(按F12键可用)可以为您提供帮助。或者你可以使用独立的工具;例如,提琴手,但这超出了本文的讨论范围。对于本教程,我将假设您正在测试您已经编写或已经访问过的代码,以便您了解测试的内部原理。

让我们看一下“MemberDirectoryController.cs”文件中的成员目录WEB API服务。在这个文件中有许多使用GET和POST谓词的API方法。让我们选择一些可以作为这个演示的基础。我将假设以下场景:

  • 使用框架中提供的帮助程序创建用户1和用户2

  • 用户1登录后向用户2发送好友请求。

  • 我们检查数据库是否包含好友请求。

  • 用户2登录并接受好友请求。

  • 我们再次检查数据库来验证这一点。

为此,我们将使用以下方法:

HttpPost

公共HttpResponseMessage加入朋友(FriendDTOpostData)

HttpPost

公共HttpResponseMessageAcceptFriend (FriendDTOpostData)

所以,我们从:

  • 导航到" DotNetNuke.Tests.Integration "
  • 选择它下面的" Tests "文件夹
  • 添加一个名为MemberDirectory的新文件夹
  • 在它下面添加一个名为“MemberDirectoryTests.cs”的类。
  • 修改新类以继承“IntegrationTestBase”类(这是一个集成框架类,它简化了编写测试的许多事情)
  • 创建一个空的阳性测试方法,并将NUnit必需属性添加到代码中

最终的结果应该是这样的:

与解决方案"></p>
             <p class=使用DNN.Integration.Test.Framework;

使用NUnit.Framework;

名称空间DotNetNuke.Tests.Integration.Tests.MemberDirectory

{

有关

公共MemberDirectoryTestsIntegrationTestBase

{

测试

公共无效Send_And_Accept_Friendship_Requests_Positive_Test ()

{

断言fail ();

}

}

}

识别WEP API端点

要知道WEB API方法的端点是什么,我们需要查看“MemberDirectoryServiceRouteMapper.cs”,它包含以下代码:

mapRouteManager。MapHttpRoute (

MemberDirectory

“默认”

“{控制器}/{行动}”

[] {“DotNetNuke.Modules.MemberDirectory.Services”});

文件“MemberDirectoryController.cs”包含:

公共MemberDirectoryControllerDnnApiController

HttpPost

公共HttpResponseMessage加入朋友FriendDTOpostData)

从上面我们可以制定端点调用添加朋友方法将是:

文章http:// <站点url > / api / MemberDirectory / MemberDirectory /加入朋友

在上面的代码中,第一个“MemberDirectory”是MapHttpRoute的第一个参数(在第一个代码片段中),而第二个参数是不包含“controller”文本部分的控制器名称(在第二个代码片段中),端点“AddFriend”的最后一部分是我们正在调用的方法。所有这些部分都在上面的代码中突出显示。

添加集成测试代码

注意:在继续之前,您需要确保您更新了测试项目的“App.config”文件值,以匹配您正在测试的站点。

我们通过创建用于测试的两个用户开始编写代码。为了实现这一点,我们利用了集成测试框架中可用的助手。我建议您熟悉这些帮助程序,因为它们将减少添加测试的代码量、时间和工作量。

测试包含许多需要解释的操作和断言,我将其作为注释添加到代码中。以下是完整的文件:

使用系统;

使用DNN.Integration.Test.Framework;

使用DNN.Integration.Test.Framework.Helpers;

使用NUnit.Framework;

名称空间DotNetNuke.Tests.Integration.Tests.MemberDirectory

{

有关

公共MemberDirectoryTestsIntegrationTestBase

{

私人常量字符串AddFriendQuery =“/ api / MemberDirectory / MemberDirectory /加入朋友”

私人常量字符串AcceptFriendQuery =“/ api / InternalServices / RelationshipService / AcceptFriend”

测试

公共无效Send_And_Accept_Friendship_Requests_Positive_Test ()

{

intuserId1, fileId1, userId2, fileId2;

字符串username1 username2;

//创建两个测试用户-将创建一个名为“testuser”的用户,其中填充4

//为新用户获取一个连接(会话)。

//成功时,连接器/会话将让用户登录。

varconnector1 =WebApiTestHelper.PrepareNewUser (userId1,username1,fileId1);

varconnector2 =WebApiTestHelper.PrepareNewUser (userId2,username2,fileId2);

控制台.WriteLine (@”测试用户=>{0}{1}, connector1。用户名、connector2.UserName);

//确保没有待处理的通知,这样我们就可以检查add-friend通知

DatabaseHelper.ExecuteNonQuery ("DELETE FROM {objectQualifier}CoreMessaging_Messages");

varnotificationsCount =DatabaseHelper.ExecuteScalar <int> (

"SELECT COUNT(*) FROM {objectQualifier}CoreMessaging_Messages");

断言.AreEqual (0, notificationsCount);

//发送用户1向用户2添加好友请求我们必须添加适当的标题

//通过调用GetRequestHeaders获取成员目录页面。

//注意,如果没有正确的请求头,调用可能不会成功。

varResponse1 = connector1。PostJson (AddFriendQuery{frienddid = userId2},

WebApiTestHelper.GetRequestHeaders (“会员目录”));

//确保请求成功

断言.IsTrue (response1.IsSuccessStatusCode);

//从数据库获取好友请求并检查是否存在

varnotificationId =DatabaseHelper.ExecuteScalar <int> (

"SELECT TOP 1 MessageID FROM {objectQualifier}CoreMessaging_Messages WHERE senduserid ="

+ userId1);

断言.Greater (notificationId 0);

//让用户2批准请求

connector2。PostJson (AcceptFriendQuery{NotificationId = NotificationId});

//确保通知已被处理并删除

notificationsCount =DatabaseHelper.ExecuteScalar <int> (

"SELECT COUNT(*) FROM {objectQualifier}CoreMessaging_Messages");

断言.AreEqual (0, notificationsCount);

}

}

}

请注意,对实际web站点的API调用是如何混合的,同时我们检查数据库以断言一些值被添加到数据库中或从数据库中删除。另外,请注意数据库“”对象的使用。{objectQualifier}”。如果您不使用这些限定符,那么您的测试将通过不使用限定符的站点,但是如果站点使用限定符,那么测试肯定会失败。

我不会在本教程中添加否定测试,并将其作为练习留给您,让您看看如果向不存在的用户发送请求会发生什么。

提交测试

和上一篇文章一样,您已经编写了这些测试,那么下一步是什么呢?现在是提交更改并将其推送到存储库的时候了,然后创建拉取请求。

总结

我只是触及了在DNN中添加集成测试的基础知识。平台存储库中的现有测试有更多示例供您学习。所以,不要犹豫,看看并把你喜欢的任何问题作为评论发给我。

评论

目前没有评论,请第一个发表评论。

评论形式

只有注册用户才能发表评论。

NewsArchives


Aderson Oliveira(22岁)
亚历克·惠廷顿(11岁)
亚历山德拉·戴维斯(3岁)
Alex Shirley(10岁)
安德鲁·霍夫林(3岁)
安德鲁·纳斯(30岁)
安迪·特里巴(1)
安东尼·格伦赖特(5岁)
安东尼奥·夏格里(28岁)
阿什·普拉萨德(37岁)
本·施密特(1)
本杰明·赫尔曼(25岁)
伯努瓦·萨顿(9岁)
贝丝·费尔堡(12岁)
比尔·沃克(36岁)
鲍勃·克鲁格(5岁)
波格丹·莱特斯库(1)
布莱恩·杜克斯(2岁)
白雪皑皑(1)
布鲁斯·查普曼(20岁)
布莱恩·安德鲁斯(1)
卡塔·康诺利(55岁)
查尔斯·纳斯(163)
克里斯·哈蒙德(第213届)
克里斯·帕特拉(55岁)
克林特·帕特森(108)
邝党(21岁)
丹尼尔·巴塞洛缪(2岁)
丹尼尔·梅特勒(181)
丹尼尔·瓦拉达斯(48岁)
戴夫·巴克纳(2岁)
大卫·波因德克斯特(12岁)
大卫·罗德里格斯(3岁)
萧耀文(1)
道格·豪厄尔(11岁)
Erik van Ballegoij(30岁)
恩斯特·彼得·塔明加(80岁)
弗朗西斯科·佩雷斯·安德烈斯(17岁)
杰夫·巴洛(12岁)
乔治·阿拉特拉什(12岁)
吉福德·沃特金斯(3)
吉尔·勒·皮戈彻(3)
伊恩·罗宾逊(7岁)
以色列·马丁内斯(17岁)
简·布洛姆奎斯特(2)
简·乔纳斯(3岁)
贾斯普雷特·巴蒂亚(1)
詹妮·梅里菲尔德(6岁)
乔·布林克曼(274)
约翰·米切尔(1)
乔恩·亨宁(14岁)
乔纳森·希利(4岁)
乔丹·库珀史密斯(1)
约瑟夫·克雷格(2岁)
马侃(1)
凯文贝吉(3岁)
凯利·福特(4岁)
肯·格里尔森(10岁)
凯文·施莱纳(6岁)
利·波因特(31岁)
洛林·杨(60岁)
Malik Khan (1)
马特·拉特利奇(2岁)
马蒂亚斯·施洛曼(16岁)
毛里西奥Márquez (5)
迈克尔·多克西(7岁)
迈克尔·托比什(3岁)
迈克尔·华盛顿(2002)
米格尔·加梅坦(3)
迈克·霍顿(19岁)
米歇尔·塞勒斯(40岁)
弥敦罗孚(3)
Navin V Nagiah(14岁)
n (31)
Nik Kalyani(14岁)
奥利弗·海因(1)
帕特里西奥·f·萨利纳斯(1)
帕特里克·瑞恩(1)
彼得·唐克(54岁)
菲利普·比德尔(135岁)
菲利普·贝克尔(4岁)
理查德·杜马斯(22岁)
罗伯特·J·柯林斯(5岁)
罗杰·塞尔温(8岁)
鲁本·洛佩兹(1)
莱恩·马丁内斯(1岁)
Sacha Trauwaen (1)
爱沙尼亚语(4)
Sanjay Mehrotra(9岁)
斯科特·麦卡洛克(1)
斯科特·施莱西尔(11岁)
斯科特·威尔金森(3岁)
斯科特·威尔海特(97岁)
塞巴斯蒂安·洛波德(80岁)
肖恩·沃克(237)
肖恩·梅哈菲(17岁)
斯蒂芬·卡尔曼(12岁)
Stefan Kamphuis(12岁)
史蒂夫·法比安(31岁)
史蒂文·费舍尔(1)
蒂莫·布鲁梅尔霍夫(24岁)
托尼·亨利克(3岁)
托斯滕·韦根(3岁)
第谷·德·沃德(4)
Vicenç Masanas(27岁)
Vincent Nguyen(3岁)
维塔利·科扎达耶夫(6岁)
威尔·摩根维克(40岁)
威尔·斯特罗尔(180岁)
威廉·塞弗伦斯(5岁)
什么是液体含量?
找出
什么是液体含量?
找出
什么是液体含量?
找出
Baidu
map