feat: 完成单元测试搭建

This commit is contained in:
橙子
2025-02-23 01:41:31 +08:00
parent f6b19ec2a5
commit f9341fd2ac
11 changed files with 86 additions and 175 deletions

View File

@@ -1,110 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp.Uow;
using Xunit;
using Yi.Framework.Rbac.Application.Contracts.IServices;
using Yi.Framework.Rbac.Domain.Entities;
using Yi.Framework.Rbac.Domain.Shared.Consts;
using Yi.Framework.SqlSugarCore.Abstractions;
namespace Yi.Abp.Test.Demo
{
public class ThreadDb_Test : YiAbpTestBase
{
/// <summary>
/// 并发
/// </summary>
/// <returns></returns>
[Fact]
public async Task Repository_Test()
{
try
{
var rep = GetRequiredService<ISqlSugarRepository<UserAggregateRoot>>();
List<Task> tasks = new List<Task>();
for (int i = 0; i < 10; i++)
{
tasks.Add(Task.Run(async () =>
{
await rep.GetListAsync();
}));
}
await Task.WhenAll(tasks);
await Console.Out.WriteLineAsync("成功");
}
catch
(Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
/// <summary>
/// 工作单元
/// </summary>
/// <returns></returns>
[Fact]
public async Task Uow_In_Test()
{
try
{
var rep = GetRequiredService<ISqlSugarRepository<UserAggregateRoot>>();
List<Task> tasks = new List<Task>();
for (int i = 0; i < 10; i++)
{
tasks.Add(Task.Run(async () =>
{
using (var uow = GetRequiredService<IUnitOfWorkManager>().Begin(true, true))
{
await rep.GetListAsync();
await uow.CompleteAsync();
}
}));
}
await Task.WhenAll(tasks);
await Console.Out.WriteLineAsync("成功");
}
catch
(Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
/// <summary>
/// 工作单元
/// </summary>
/// <returns></returns>
[Fact]
public async Task Uow_Out_Test()
{
try
{
var rep = GetRequiredService<ISqlSugarRepository<UserAggregateRoot>>();
List<Task> tasks = new List<Task>();
using (var uow = GetRequiredService<IUnitOfWorkManager>().Begin(true, true))
{
for (int i = 0; i < 10; i++)
{
tasks.Add(Task.Run(async () =>
{
await rep.GetListAsync();
await uow.CompleteAsync();
}));
}
}
await Task.WhenAll(tasks);
await Console.Out.WriteLineAsync("成功");
}
catch
(Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
}
}

View File

@@ -1,18 +0,0 @@
using Shouldly;
using Xunit;
using Yi.Framework.Rbac.Application.Contracts.IServices;
using Yi.Framework.Rbac.Domain.Shared.Consts;
namespace Yi.Abp.Test.Demo
{
public class User_Test : YiAbpTestBase
{
[Fact]
public async Task Get_User_List_Test()
{
var service = GetRequiredService<IUserService>();
var user = await service.GetListAsync(new Framework.Rbac.Application.Contracts.Dtos.User.UserGetListInputVo { UserName = UserConst.Admin });
user.ShouldNotBeNull();
}
}
}

View File

@@ -20,7 +20,6 @@ namespace Yi.Abp.Test
{ {
public override void ConfigureServices(ServiceConfigurationContext context) public override void ConfigureServices(ServiceConfigurationContext context)
{ {
Configure<AbpBackgroundWorkerOptions>(options=>options.IsEnabled=false);
} }
} }
} }

View File

@@ -1,44 +1,38 @@
using System; using Microsoft.AspNetCore.Builder;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Hosting;
using NSubstitute.Extensions;
namespace Yi.Abp.Test namespace Yi.Abp.Test;
public class YiAbpTestWebBase:YiAbpTestBase
{ {
public class YiAbpTestWebBase:YiAbpTestBase public HttpContext HttpContext { get; private set; }
public YiAbpTestWebBase():base()
{ {
public HttpContext HttpContext { get; private set; } HttpContext httpContext = DefaultHttpContextAccessor.CurrentHttpContext;
public YiAbpTestWebBase():base() this.ConfigureHttpContext(httpContext);
{ HttpContext = httpContext;
HttpContext httpContext = DefaultHttpContextAccessor.CurrentHttpContext; IApplicationBuilder app = new ApplicationBuilder(this.ServiceProvider);
this.ConfigureHttpContext(httpContext); RequestDelegate httpDelegate = app.Build();
HttpContext = httpContext; httpDelegate.Invoke(httpContext);
IApplicationBuilder app = new ApplicationBuilder(this.ServiceProvider); }
RequestDelegate httpDelegate = app.Build();
httpDelegate.Invoke(httpContext);
}
public override void ConfigureServices(HostBuilderContext host, IServiceCollection service) public override void ConfigureServices(HostBuilderContext host, IServiceCollection service)
{ {
service.Replace(new ServiceDescriptor(typeof(IHttpContextAccessor), typeof(DefaultHttpContextAccessor), ServiceLifetime.Singleton)); service.Replace(new ServiceDescriptor(typeof(IHttpContextAccessor), typeof(DefaultHttpContextAccessor), ServiceLifetime.Singleton));
base.ConfigureServices(host, service); base.ConfigureServices(host, service);
} }
protected virtual void ConfigureHttpContext(HttpContext httpContext) protected virtual void ConfigureHttpContext(HttpContext httpContext)
{ {
httpContext.Request.Path= "/test"; httpContext.Request.Path= "/test";
}
} }
} }
internal class DefaultHttpContextAccessor : IHttpContextAccessor internal class DefaultHttpContextAccessor : IHttpContextAccessor
{ {
internal static HttpContext? CurrentHttpContext { get; set; } = new DefaultHttpContext(); internal static HttpContext? CurrentHttpContext { get; set; } = new DefaultHttpContext();
public HttpContext? HttpContext { get => CurrentHttpContext; set => throw new NotImplementedException(); } public HttpContext? HttpContext { get => CurrentHttpContext; set => throw new NotImplementedException(); }
} }

View File

@@ -1,13 +1,8 @@
using System; using Microsoft.AspNetCore.Http;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Shouldly; using Shouldly;
using Xunit; using Xunit;
namespace Yi.Abp.Test.Demo namespace Yi.Abp.Test.example
{ {
public class HttpUser_Test : YiAbpTestWebBase public class HttpUser_Test : YiAbpTestWebBase
{ {

View File

@@ -0,0 +1,52 @@
using Volo.Abp.Uow;
using Xunit;
using Yi.Framework.Rbac.Domain.Entities;
using Yi.Framework.SqlSugarCore.Abstractions;
namespace Yi.Abp.Test.example
{
public class ThreadDb_Test : YiAbpTestBase
{
/// <summary>
/// 工作单元
/// </summary>
/// <returns></returns>
[Fact]
public async Task Uow_In_Test()
{
try
{
var uowManager = GetRequiredService<IUnitOfWorkManager>();
var tasks = new List<Task>();
// 创建10个任务但不立即执行
for (int i = 0; i < 10; i++)
{
var task = new Task(async () =>
{
using (var uow = uowManager.Begin())
{
var rep = GetRequiredService<ISqlSugarRepository<UserAggregateRoot>>();
var result = await rep.GetListAsync();
await uow.CompleteAsync();
}
});
tasks.Add(task);
}
// 同时启动所有任务
foreach (var task in tasks)
{
task.Start();
}
await Task.WhenAll(tasks);
// 如果执行到这里没有抛出异常,说明并发测试成功
Assert.True(true, "并发工作单元测试成功");
}
catch (Exception ex)
{
Assert.True(false, $"并发工作单元测试失败: {ex.Message}");
}
}
}
}

View File

@@ -18,12 +18,12 @@ using Yi.Framework.SqlSugarCore.Abstractions;
namespace Yi.Framework.Rbac.Test.System namespace Yi.Framework.Rbac.Test.System
{ {
public class Account_Test : YiTestWebBase public class AccountFrameworkRbacTest : YiFrameworkRbacTestWebBase
{ {
private IAccountService _accountService; private IAccountService _accountService;
private ISqlSugarRepository<UserAggregateRoot> _userRepository; private ISqlSugarRepository<UserAggregateRoot> _userRepository;
public Account_Test() public AccountFrameworkRbacTest()
{ {
_accountService = GetRequiredService<IAccountService>(); _accountService = GetRequiredService<IAccountService>();
_userRepository = GetRequiredService<ISqlSugarRepository<UserAggregateRoot>>(); _userRepository = GetRequiredService<ISqlSugarRepository<UserAggregateRoot>>();

View File

@@ -13,11 +13,11 @@ using Yi.Framework.SqlSugarCore.Abstractions;
namespace Yi.Framework.Rbac.Test.System namespace Yi.Framework.Rbac.Test.System
{ {
public class User_Test : YiTestBase public class UserFrameworkRbacTest : YiFrameworkRbacTestBase
{ {
private IUserService _userService; private IUserService _userService;
private ISqlSugarRepository<UserAggregateRoot> _repository; private ISqlSugarRepository<UserAggregateRoot> _repository;
public User_Test() public UserFrameworkRbacTest()
{ {
_userService = ServiceProvider.GetRequiredService<IUserService>(); _userService = ServiceProvider.GetRequiredService<IUserService>();
_repository = ServiceProvider.GetRequiredService<ISqlSugarRepository<UserAggregateRoot>>(); _repository = ServiceProvider.GetRequiredService<ISqlSugarRepository<UserAggregateRoot>>();

View File

@@ -8,11 +8,11 @@ using Yi.Framework.Rbac.SqlSugarCore.Repositories;
namespace Yi.Framework.Rbac.Test namespace Yi.Framework.Rbac.Test
{ {
public class YiTestBase : AbpTestBaseWithServiceProvider public class YiFrameworkRbacTestBase : AbpTestBaseWithServiceProvider
{ {
public ILogger Logger { get; private set; } public ILogger Logger { get; private set; }
protected IServiceScope TestServiceScope { get; } protected IServiceScope TestServiceScope { get; }
public YiTestBase() public YiFrameworkRbacTestBase()
{ {
//在启动之前清除sqlite全库由于非常危险建议使用sqlite //在启动之前清除sqlite全库由于非常危险建议使用sqlite
//Microsoft.Data.Sqlite.SqliteConnection.ClearAllPools(); //Microsoft.Data.Sqlite.SqliteConnection.ClearAllPools();

View File

@@ -15,8 +15,7 @@ namespace Yi.Framework.Rbac.Test
typeof(YiFrameworkRbacApplicationModule), typeof(YiFrameworkRbacApplicationModule),
typeof(YiFrameworkRbacSqlSugarCoreModule), typeof(YiFrameworkRbacSqlSugarCoreModule),
typeof(AbpAutofacModule), typeof(AbpAutofacModule)
typeof(AbpAuditingModule)
)] )]
public class YiFrameworkRbacTestModule : AbpModule public class YiFrameworkRbacTestModule : AbpModule
{ {

View File

@@ -12,10 +12,10 @@ using NSubstitute.Extensions;
namespace Yi.Framework.Rbac.Test namespace Yi.Framework.Rbac.Test
{ {
public class YiTestWebBase : YiTestBase public class YiFrameworkRbacTestWebBase : YiFrameworkRbacTestBase
{ {
public HttpContext HttpContext { get; private set; } public HttpContext HttpContext { get; private set; }
public YiTestWebBase() : base() public YiFrameworkRbacTestWebBase() : base()
{ {
HttpContext httpContext = DefaultHttpContextAccessor.CurrentHttpContext; HttpContext httpContext = DefaultHttpContextAccessor.CurrentHttpContext;
ConfigureHttpContext(httpContext); ConfigureHttpContext(httpContext);