今儿给大家分享下,在ASP.NET Core下使用TestServer进行集成测试,这意味着你可以在没有IIS服务器或任何外部事物的情况下测试完整的Web应用程序。 UseEnvironment("Development") .UseStartup<TestStartup>(); using (var server = new TestServer
然而这个方法一开启我就被拖出去了…… 因为开启主机会占用端口,而刚好我的几个项目都采用了相同的端口 而我开始尝试在配置文件里面指定随机的端口,而此时又有玄学的网络权限,但是我又不知道将谁拖出去 此时小伙伴给我安利了 TestServer <PackageReference Include="Microsoft.AspNetCore.TestHost" Version="3.1.10" /> </ItemGroup> 在使用 TestServer webBuilder.UseStartup<Startup>(); webBuilder.UseTestServer(); //关键是多了这一行建立TestServer 此时运行的主机不会去监听端口,因此不能通过端口的形式去调用他,而是需要使用 TestServer 提供的扩展方法获取 HttpClient 去访问。
&& yum install postfix 2、 启动服务并启用开机自动启动: # systemctl start postfix # systemctl enable postfix [root@testserver ~]# postconf -e inet_interfaces=loopback-only [root@testserver ~]# postconf -e mynetworks="127.0.0.0 /8" [root@testserver ~]# postconf -e myorigin=ldap.example.com [root@testserver ~]# postconf -e "mydestination =" [root@testserver ~]# postconf -e "local_transport=error: local delivery disabled" [root@testserver [root@testserver ~]# firewall-cmd --reload
为了演示部署过程,我通过 VMware 创建了两台主机,分别为 TestServer1(192.168.0.1) 和 TestServer2(192.168.0.2)。 和 TestServer2 上执行上述操作,将 MySQL 在两台主机上编译安装。 设为 TestServer2 的主服务器 在 TestServer1 上执行: MySQL> grant replication slave on *.* to ‘slave’@’%’ identified 设置 TestServer1 的主服务器 在 TestServer2 上执行 MySQL> grant replication slave on *.* to ‘slave’@’%’ identified 然后我们在 TestServer1 上插入三条记录 INSERT INTO `test` (`name`) VALUES (‘a’),(‘b’),(‘c’) 这时,在 TestServer1 和 TestServer2
;testServer"; service testServer { rpc SayHello (Request) returns(Response){ } } message Request } func (s *Server) SayHello(ctx context.Context, t *testServer.Request) (*testServer.Response, error //grpc server 注册server服务 server := &Server{} testServer.RegisterTestServerServer(srv, server) //grpc = nil { panic(err) } client := testServer.NewTestServerClient(conn) ctx := context.Background() md //调用的本地 resp, md, err := local_request_TestServer_SayHello_0(rctx, inboundMarshaler, server, req,
,dc=com" read by * none database bdb suffix "dc=testserver,dc=com" checkpoint 1024 15 cachesize 10000 rootdn "cn=admin,ou=ldap,ou=admin,dc=testserver,dc=com" # ldapsearch -x -D "cn=admin,dc=testserver,dc=com" -h 10.24.103.17 -W -b 'ou=People,dc=testserver,dc= 这样才能正常查询结果 1 ldapsearch -x -D "cn=admin,ou=ldap,ou=admin,dc=testserver,dc=com" -h 10.24.103.17 -W 11. 查询数据,确认已经导入成功即可 ldapsearch -LLL -x -D "cn=admin,ou=ldap,ou=admin,dc=testserver,dc=com" -W -b "dc=testserver
TestServer不会在网络上进行监听, TestServer创建了一个名为Host的属性, 它的类型是IWebHost, 它可以用来处理内存里的请求对象. 下图是被测试系统在生产环境和集成测试使用TestServer情形下的对比图: ? TestServer不监听网络请求, 它使用HttpClient在内存里发送请求. 仔细看一下集成测试时使用TestServer的流图: ? 图中可以看到: 测试代码创建TestServer, TestServer创建HttpClient. 测试代码使用HttpClient发送请求接收响应. 这里面按照之前讲的顺序, 创建IWebHostBuilder, 并用它创建TestServer, 然后TestServer创建HttpClient.
2345] respawn exec /usr/local/src/testserver/testserver 然后启动 initctl reload-configuration initctl list initctl start testserver 通过initctl list即可看程序是不是处于running启动状态。 文件 [Unit] Description=testserver [Service] # 应用程序所在的文件目录 WorkingDirectory=/usr/local/src/testserver/ ExecStart=/usr/local/src/testserver/testserver Restart=always # 如果服务崩溃,10秒后重新启动服务 RestartSec=10 KillSignal //立即启动 systemctl start testserver.service //状态查看 systemctl status testserver.service
所以这种方案做集成测试我给: ⭐⭐ 方案二:实例化TestServer对象 这种是比较常见的,也是微软官方架构项目eShopOnContainers的推荐方案,简单来说,就是微软提供了一个TestSever 的类,为我们提供一个类似WebHost的宿主服务器,只不过是测试服务器,那如何测试Controller控制器呢,示例代码如下: public TestServer CreateServer() { = new TestServer(hostBuilder); testServer.Host .MigrateDbContext<CatalogContext>((context ; } 可以看到,通过new TestServer()的方式,生成一个服务器,就可以发起请求了,核心的还是我们的WebHostBuilder。 但是有一个很致命的问题,我们在.NET5以后,使用Autofac做依赖注入的容器,而且ConfigureServices也是没有返回值的,这样在使用上面的TestServer,就会报错,提示找不到Autofac
TestServer 还记得我们在集成测试中提供的TestServer吗?TestServer 是由 Microsoft.AspNetCore.TestHost 包提供的。 通过使用 TestServer,开发人员可以在测试中模拟整个应用程序的运行环境,包括中间件的执行,从而进行集成测试和端到端测试。 中间件可以使用 TestServer 单独测试。 Assert.Contains("Middleware Test Completed", responseContent); Run Test 使用 HttpContext 发送请求 可以使用 TestServer 添加请求路由 这个比较好理解,就是在TestServer中添加路由的功能和Asp.Net Core中添加路由基本一致 [Fact] public async Task TestWithEndpoint_ExpectedResponse 通过使用TestServer和HttpContext发送请求,我们可以模拟整个应用程序的运行环境,从而进行集成测试和端到端测试。
{ public: TestServer(EventLoop *loop, const InetAddress &listenAddr, int numThreads ) { server_.setConnectionCallback( boost::bind(&TestServer::onConnection, this , _1)); server_.setMessageCallback( boost::bind(&TestServer::onMessage, this, _1, ] - new connection[TestServer:0.0.0.0:8888#1] from 127.0.0.1:56411 - TcpServer.cc:93 20131108 11:33: ] - new connection[TestServer:0.0.0.0:8888#2] from 127.0.0.1:56412 - TcpServer.cc:93 20131108 11:33:
image.png 因此,ES6环境下正常的split操作流程应该是这样: PUT testserver{ "settings": { "index.number_of_shards /testserver-target? POST testserver/_split/testserver-target? " } 我们可以使用GET _cat/shards/testserver-target,查看目标索引的分片分布 image.png 如果目标索引的个数大于30呢,我们看看是什么效果? POST testserver/_split/testserver-target?
_(loop), server_(loop, listenAddr, "TestServer") { server_.setConnectionCallback ( boost::bind(&TestServer::onConnection, this, _1)); server_.setMessageCallback( ] - new connection [TestServer:0.0.0.0:8888#1] from 127.0.0.1:54898 - TcpServer.cc:93 20131110 04:47 :26.868831Z 2330 DEBUG TcpConnection TcpConnection::ctor[TestServer:0.0.0.0:8888#1] at 0x84AE920 fd= ( boost::bind(&TestServer::onConnection, this, _1)); server_.setMessageCallback(
被调服务 TestServer 首先我们创建一个被调服务,应用名为 TestApp,服务名为TestServer,Obj名为Test,如下 ? 生成如下文件 ? 因为主调服务要调用被调服务 TestServer的接口,我们需要将Test.tars复制到路径src下。 ? 现在,在 TarsWeb 上重启 TestServer 服务,然后我们再次请求HttpServer服务,结果如下 ? 可见服务 HttpServer 调用 TestServer 时超时了,没有响应。 查询被调服务 TestServer的日志,会发现 TestServer接收到了本次请求,但是认证失败了,因此直接关闭了此连接。 ? 修改主调方的配置文件添加账号密钥 要让主调服务 HttpServer 能够调用开启了鉴权的 TestServer服务,我们也要在 HttpServer中配置相同账号和密钥。
,dc=com" read by * none database bdb suffix "dc=testserver,dc=com" checkpoint 1024 15 cachesize # ldapsearch -x -D "cn=admin,dc=testserver,dc=com" -h 10.24.103.17 -W -b 'ou=People,dc=testserver,dc= 这样才能正常查询结果 ldapsearch -x -D "cn=admin,ou=ldap,ou=admin,dc=testserver,dc=com" -h 10.24.103.17 -W 11. 导入数据命令 ldapadd -x -D "cn=admin,ou=ldap,ou=admin,dc=testserver,dc=com" -h 10.24.103.17 -W -f ldapexport.ldif 查询数据,确认已经导入成功即可 ldapsearch -LLL -x -D "cn=admin,ou=ldap,ou=admin,dc=testserver,dc=com" -W -b "dc=testserver
{ public: TestServer(EventLoop *loop, const InetAddress &listenAddr, int numThreads ) { server_.setConnectionCallback( boost::bind(&TestServer::onConnection, this , _1)); server_.setMessageCallback( boost::bind(&TestServer::onMessage, this, _1, ] - new connection[TestServer:0.0.0.0:8888#1] from 127.0.0.1:56411 - TcpServer.cc:93 20131108 11:33: ] - new connection[TestServer:0.0.0.0:8888#2] from 127.0.0.1:56412 - TcpServer.cc:93 20131108 11:33:
{ TestServer, "1.0.0", async fn do_run1(&self,res : ReqDto) -> ResDto { println!("{:?}" ,res); return ResDto { str : "TestServer say hello 1".to_string()}; } async fn do_run2(&self,res ,res); return ResDto { str : "TestServer say hello 2".to_string()}; } } #[tokio::main(worker_threads = 512)] async fn main() { let server: TestServer = TestServer { _db: "我是一个DB数据库".to_string { CLI, TestServer, "1.0.0", async fn do_run1(&self,res : ReqDto) -> ResDto async fn do_run2
在开始之前,我们需要先准备一个 TARS 服务,供之后的客户端调用,源码见 TestServer 源码(文末附链接)。 我们创建一个服务,应用名为 TestApp,服务名 TestServer,Obj 名为 Test,Test.tars 文件中定义的接口如下 moduleTestApp{interfaceTest{int 同时,染色日志开启期间,调用了服务 TestApp.TestServer.TestObj 的接口 test。 123456TestApp.TestServer.TestObj test 该命令通过 TarsWeb 页面的 服务管理->更多命令->自定义命令 来发送,如图所示 ? isDyeingReq 需要传入三个参数,routekey 标识的入参值(id),服务对象名(TestApp.TestServer.TestObj)和接口名称(test)。
服务器端程序 10 * 11 * @author Hongten 12 * 13 * @time 2012-4-29 2012 14 */ 15 public class TestServer ta; 21 private TextField tf; 22 23 public static void main(String args[]) { 24 TestServer ts = new TestServer(); 25 ts.createUI(); 26 ts.connect(); 27 ts.createThread server; 101 102 public MyServerListener(TestServer server) { 103 this.server = server; server; 126 127 public MyServerReader(TestServer server) { 128 this.server = server; 129
安装完成后,您应该能够在服务地图中找到 postgres 和 testserver。 当搜索 Postgres 时的服务地图 当搜索 Testserver 时的服务地图 生成流量 现在,让我们检查是否可以查看它们之间的流量。 端口转发到 testservice: kubectl port-forward --namespace testserver service/testserver-service 8200:8200 运行以下命令以生成模拟数据 然后,您将看到此连接在服务地图中创建(请注意边缘是红色的,表示延迟很高): 生成的流量 点击 testserver-deployment(相同的流量也可以在 postgres 服务和 postgres 部署上查看) Testserver deployment 然后点击 POSTGRES Postgres 流量 在这里,您将看到执行的插入查询。