介绍
这是第三篇文章,指导那些想为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必需属性添加到代码中
最终的结果应该是这样的:
使用DNN.Integration.Test.Framework;
使用NUnit.Framework;
名称空间DotNetNuke.Tests.Integration.Tests.MemberDirectory
{
[有关]
公共类MemberDirectoryTests:IntegrationTestBase
{
[测试]
公共无效Send_And_Accept_Friendship_Requests_Positive_Test ()
{
断言fail ();
}
}
}
识别WEP API端点
要知道WEB API方法的端点是什么,我们需要查看“MemberDirectoryServiceRouteMapper.cs”,它包含以下代码:
mapRouteManager。MapHttpRoute (
"MemberDirectory",
“默认”,
“{控制器}/{行动}”,
新[] {“DotNetNuke.Modules.MemberDirectory.Services”});
文件“MemberDirectoryController.cs”包含:
公共类MemberDirectoryController:DnnApiController
…
[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
{
[有关]
公共类MemberDirectoryTests:IntegrationTestBase
{
私人常量字符串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中添加集成测试的基础知识。平台存储库中的现有测试有更多示例供您学习。所以,不要犹豫,看看并把你喜欢的任何问题作为评论发给我。