【Dotnet 工具箱】推薦一個使用 C# 開發的輕量級壓測工具

2023-07-21 12:00:28

你好,這裡是 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,拿來使用或者學習都是不錯的。

截圖預覽

監控頁面

監控詳情頁面

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 命令的輸出。