首页 > 编程语言 >【Dotnet 工具箱】推荐一个使用 C# 开发的轻量级压测工具

【Dotnet 工具箱】推荐一个使用 C# 开发的轻量级压测工具

时间:2023-07-21 11:48:12浏览次数:43  
标签:请求 C# Gui Pos Terminal -- Dotnet LoadTestToolbox 轻量级

你好,这里是 Dotnet 工具箱,定期分享 Dotnet 有趣,实用的工具和组件,希望对您有用!

轻量级压测工具

LoadTestToolbox 是一个使用 C# 开发的轻量级压测工具,基于 .NET 6 版本, 和其他压测工具相比,LoadTestToolbox 安装和使用都非常简单。

LoadTestToolbox 提供了一种可靠的方式来模拟高负载情况,来确定系统的瓶颈和性能极限,并且支持以图片输出压测结果。

如何安装

直接作为 .NET 全局工具安装,执行以下的命令,需要 .NET 6。

dotnet tool install --global LoadTestToolbox

非常简单,LoadTestToolbox 压测工具已经安装成功!

如何使用

LoadTestToolbox 目前包含了三个工具,分别是 drill (钻头), hammer (锤子), nailgun (钉枪)。

drill 钻头

Drill 可以通过在更长的时间内, 以间隔不断的请求,来进行测试应用的长期稳定性。

比如:

ltt drill --url https://www.baidu.com/ --rps 100 --duration 10 --filename chart.png

在上面的命令中,LoadTestToolbox 将每秒发出 100 个请求(以一致的 20 毫秒间隔),持续 10 秒,请求到 www.baidu.com。

完成后,会输出到笛卡尔图的测试结果,并且显示每个请求和对应的响应时间。

输出结果:

Hammer 锤子

Hammer 可以通过指定范围的并发请求,测试接口的性能,并返回每个请求的平均响应时间。

比如:

ltt hammer --url http://www.qq.com --min 1 --max 100 --filename chart.png

上面的命令会同时发出 1 个请求,然后是 2 个、3 个,依此类推,最多是 100 个并发请求。

输出结果

Nailgun 钉枪

Nailgun 可以对指定的接口发起瞬间的大量请求,来测试接口性能。

比如一次性发起 100 个请求:

~$ ltt nailgun --url http://www.qq.com/ --requests 100 --filename chart.png

输出结果

上面就是 LoadTestToolbox 的三个主要工具。

LoadTestToolbox 还支持各种配置,HTTP 请求方法,请求头,请求体等。

开源和跨平台 WebAPI 监控工具

Ketum 是一个跨平台的开源工具,可以让您能够轻松测试和监控网站的运行状况。

Ketum 提供了简单易读的图表来跟踪您网站的运行状况, 包括显示正常运行时间、响应时间和其他测试结果的图表,另外 Ketum 还支持邮件通知。

Ketum 的后端使用了 ABP 框架,前端使用了 Blazor,拿来使用或者学习都是不错的。

截图预览

image

监控页面

监控详情页面

Terminal.Gui - 适用于 .NET 的跨平台终端 UI 工具包

Terminal.Gui

Terminal.Gui 是一个使用 C# 开发的基于控制台的工具库。这个框架的设计目的是, 在单色终端和支持鼠标的现代彩色终端上, 开发人员也可以非常轻松地进行开发并运行程序。

Terminal.Gui 是跨平台的, 它适用于 Windows、Linux 和 MacOS。

如何使用?

在 .NET Core 项目中安装, 可以使用 dotnet CLI 或者 Nuget。

dotnet add package Terminal.Gui

下面是一个简单的示例:

using Terminal.Gui;

class Demo
{
    static int Main()
    {
        Application.Init();

        var n = MessageBox.Query(50, 7,
            "Question", "你喜欢这个控制台应用吗?", "Yes", "No");

        Application.Shutdown();
        return n;
    }
}

运行程序后,控制台显示内容如下:

这个代码进行提示并返回一个整数值,它取决于用户选择的值(Yes,No,或者不选择去按 ESC 键)。

还可以通过组合所包含的各种视图来创建更有趣的用户界面。

下面是一个使用用户名和密码进行登录的一个示例。

// A simple Terminal.Gui example in C# - using C# 9.0 Top-level statements

using Terminal.Gui;

Application.Run<ExampleWindow> ();

System.Console.WriteLine ($"Username: {((ExampleWindow)Application.Top).usernameText.Text}");

// Before the application exits, reset Terminal.Gui for clean shutdown
Application.Shutdown ();

// Defines a top-level window with border and title
public class ExampleWindow : Window {
	public TextField usernameText;
	
	public ExampleWindow ()
	{
		Title = "Example App (Ctrl+Q to quit)";

		// Create input components and labels
		var usernameLabel = new Label () { 
			Text = "Username:" 
		};

		usernameText = new TextField ("") {
			// Position text field adjacent to the label
			X = Pos.Right (usernameLabel) + 1,

			// Fill remaining horizontal space
			Width = Dim.Fill (),
		};

		var passwordLabel = new Label () {
			Text = "Password:",
			X = Pos.Left (usernameLabel),
			Y = Pos.Bottom (usernameLabel) + 1
		};

		var passwordText = new TextField ("") {
			Secret = true,
			// align with the text box above
			X = Pos.Left (usernameText),
			Y = Pos.Top (passwordLabel),
			Width = Dim.Fill (),
		};

		// Create login button
		var btnLogin = new Button () {
			Text = "Login",
			Y = Pos.Bottom(passwordLabel) + 1,
			// center the login button horizontally
			X = Pos.Center (),
			IsDefault = true,
		};

		// When login button is clicked display a message popup
		btnLogin.Clicked += () => {
			if (usernameText.Text == "admin" && passwordText.Text == "password") {
				MessageBox.Query ("Logging In", "Login Successful", "Ok");
				Application.RequestStop ();
			} else {
				MessageBox.ErrorQuery ("Logging In", "Incorrect username or password", "Ok");
			}
		};

		// Add the views to the Window
		Add (usernameLabel, usernameText, passwordLabel, passwordText, btnLogin);
	}
}

运行程序后,输入 admin 和 password,页面显示如下

应用和扩展

Terminal.Gui 的社区非常活跃,已经有很多基于它开发的应用。

Terminal Gui Designer

TerminalGuiDesigner 使用 CodeDom 和 Roslyn 构建,可让您通过拖放来创建复杂的视图,就像您熟悉和喜爱的 WinForms 设计器一样。

Dotnet Dump 分析器

这是一个基于gui.cs 的小型ui,可以和 dotnet dump 一起使用,它能够列出所有受支持的 SOS 命令的输出。

标签:请求,C#,Gui,Pos,Terminal,--,Dotnet,LoadTestToolbox,轻量级
From: https://www.cnblogs.com/dotnet-box/p/17570865.html

相关文章

  • SVN的标准目录结构:trunk、branches、tags
    我们在一些著名开源项目的版本库中,通常可以看到trunk,branches,tags等三个目录。由于SVN固有的特点,目录在SVN中并没有特别的意义,但是这三个目录却在大多数开源项目中存在,这是因为这三个目录反映了软件开发的通常模式。trunk是主分支,是日常开发进行的地方。branches是分支......
  • 图解SVN开发版本控制和发布流程,Trunk、Tag、Branch的使用
    介绍一种比较合理的SVNTrunk、Tag和Branch使用方法。先上图,再说明:  责职说明:Trunk:用于各版本开发提交代码TAG:用于记录和保存每个release/milestone的代码Branch:用于bugfixing过程说明: 项目开始时,创建Trunk,开始1.0.0开发所有小组成员都往Trunk中提交代码当1.0.0......
  • TCP灌包中RTT时延与RTO超时关系
    TCP的RTT算法从前面的TCP重传机制我们知道Timeout的设置对于重传非常重要。设长了,重发就慢,丢了老半天才重发,没有效率,性能差;设短了,会导致可能并没有丢就重发。于是重发的就快,会增加网络拥塞,导致更多的超时,更多的超时导致更多的重发。而且,这个超时时间在不同的网络的情况下,根......
  • 探索Reactor网络模型在当今应用领域的革新
    本文分享自华为云社区《驾驭网络技术的未来:探索Reactor网络模型在当今应用领域的革新》,作者:LionLong。本文介绍了Linux网络设计中的Reactor网络模型及其在实际应用中的重要性。Reactor模型是一种经典的事件驱动设计模式,广泛应用于构建高性能、可扩展的网络服务器。我们将探讨R......
  • Scrapy 部署错误:subprocess.CalledProcessError 以及解决方案
    最近在使用Scrapy和Scrapyd时,我遇到了一个关于subprocess.CalledProcessError的问题。在这篇博文中,我将描述这个错误、找出的原因以及最后的解决方案。错误描述在使用scrapyd-deploy命令部署我的Scrapy项目时,我遇到了如下的错误:subprocess.CalledProcessError:Comma......
  • Untiy 网络编程-深入了解TCP
    1.从TCP到物理层应用层:应用层是给应用程序提供功能的。在发送{hello}的例子里面,计算机会把hello转化为二进制然后发送到传输层。传输层:在收到二进制数据后,传输层协议会对它进行一系列的加工,并提供数据流传送、可靠性校验,流量控制。又由于网络层的IP包......
  • CAD应用实践
     CAD应用:DATAEXTRACTION:如果将数据提取到表格;ME:等分多段线;PL:多段线命令;list:提取多段线端点坐标;  ......
  • 苹果电脑热门清理软件横向评测,四大Mac清理工具下载安装教程
    Mac一般来说基本是不会中毒的,而且像现在的windows也是很少中毒,但我们可能还是需要一款杀毒清理软件,主要是为了清理垃圾,统一查看并管理软件开机自启、权限信息等,统一卸载清理等功能,另外我们可能还想要实时查看电脑当前的CPU、内存、GPU等状态下面推荐几款Mac上使用量都还不......
  • 浅谈ADC驱动器设计
    引言谈及ADC设计时,必然要了解输入信号是什么、具有什么样的特性及采集系统的指标是什么,所以ADC的输入设计也是采集系统设计的一个难点和重点,需要根据不同的要求设计ADC的前端电路。1.高速ADC模拟输入指标对于高速ADC系统而言,我们必须明确其输入的指标要求,才能更好的发挥出ADC......
  • LeetCode -- 773. 滑动谜题
     启发式搜索 classSolution{structNode{stringstr;intx,y;intval;};intn=2,m=3;stringe="123450";intdx[4]={-1,0,1,0};intdy[4]={0,1,0,-1};intf(stringstr){intres=0;for(inti=0;i<......