प्रौद्योगिकी साझेदारी

यूनिट् टेस्टिंग् कर्तुं गच्छतु

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Go भाषायां मानकपुस्तकालये परीक्षणसङ्कुलस्य माध्यमेन यूनिटपरीक्षणं कार्यान्वितं भवति, यत् कार्याणां समुच्चयं प्रदाति यत् यूनिट् परीक्षणस्य लेखनं, चालनं, प्रबन्धनं च सरलं कुशलं च करोति

1. नियमाः

  • सञ्चिकानामकरणनियमानां परीक्षणं कुर्वन्तु
    Go इत्यस्मिन् परीक्षणसञ्चिकानामकरणनियमः योजयितुं भवति_test.go .यथा - यदि भवतः कcalculator.go file, तत्सम्बद्धा परीक्षणसञ्चिका भवितुमर्हतिcalculator_test.go

  • परीक्षणकार्यस्य नामकरणनियमाः
    परीक्षणकार्यस्य आरम्भः अवश्यं भवतिTest आरभते, तथा च कस्यापि अशून्यस्य तारस्य अनुसरणं कर्तुं शक्यते, उदाहरणार्थम्TestAddTestSubtract प्रतीक्षतु।

  • उपयुञ्जताम्‌ testing.T प्रतिपादनं त्रुटिनिवेदनं च कुर्वन्तु
    परीक्षणकार्य्ये प्रयोगःtesting.T परीक्षणस्य स्थितिं निर्गमं च प्रबन्धयितुं पैरामीटर्स् टङ्कयन्तु ।भवन्तः उपयोक्तुं शक्नुवन्तिt.Error*t.Fail* तथा परीक्षणविफलतां सूचयितुं प्रासंगिकदोषसूचनाः निर्गन्तुं च अन्यविधयः।

2. एककपरीक्षा उदाहरणम्

२.१ एकपरीक्षाप्रकरणम्

गणकसंकुलस्य गणककार्यं परिभाषितं भवति, विशिष्टं कार्यान्वयनञ्च निम्नलिखितरूपेण भवति ।

package calculator

func Add(a, b int) int {
	return a + b
}
  • 1
  • 2
  • 3
  • 4
  • 5

वर्तमाननिर्देशिकायां वयं calculator_test.go इति परीक्षणसञ्चिकां निर्माय परीक्षणकार्यं निम्नलिखितरूपेण परिभाषयामः ।

package calculator

import "testing"


func TestAdd(t *testing.T) {
	result := Add(1, 2)
	expected := 3
	if result != expected {
		t.Errorf("Add(1,2) return %d, expected %d", result, expected)
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

एतत् unit test चालयितुं go test आदेशस्य उपयोगं कुर्वन्तु ।आदेशपङ्क्तौ calculator.go तथा calculator_test.go युक्तं निर्देशिकां प्रविश्य ततः निष्पादयन्तुgo test, एते परिणामाः यथा

go test
PASS
ok      modu    0.226s
  • 1
  • 2
  • 3

२.२ बहुविधपरीक्षाप्रकरणाः

calculator_test.go इत्यत्र निम्नलिखितपरीक्षाकार्यं योजयन्तु:

func TestAdd2(t *testing.T) {
	result := Add(3, 2)
	expected := 3
	if result != expected {
		t.Errorf("Add(1,2) return %d, expected %d", result, expected)
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

आउटपुट् परिणामेषु प्रत्येकस्य परीक्षणप्रकरणस्य निष्पादनं अधिकतया द्रष्टुं वयं शक्नुमःgo test -vपैरामीटर्स् इत्येतत् सम्पूर्णपरीक्षापरिणामान् निर्गन्तुं ददाति ।

go test -v
=== RUN   TestAdd
--- PASS: TestAdd (0.00s)
=== RUN   TestAdd2
    calculator_test.go:17: Add(1,2) return 5, expected 3
--- FAIL: TestAdd2 (0.00s)
FAIL
exit status 1
FAIL    modu    0.216s
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

2.3 चालितपरीक्षाप्रकरणाः निर्दिशन्तु

go test -run आदेशः निर्दिष्टविधानानुसारं परीक्षणं चालयितुं शक्नोति । एषः आदेशः चालयितुं परीक्षणकार्यस्य चयनार्थं नियमितव्यञ्जनानां समर्थनं करोति ।

यथा, TestAdd2 उपयोगप्रकरणं सम्यक् कृत्वा, passgo tes -run=Add2केवलं TestAdd2 परीक्षणप्रकरणं चालयन्तु, परिणामः अस्ति

go test -run=Add2 -v
=== RUN   TestAdd2
--- PASS: TestAdd2 (0.00s)
PASS
ok      modu    0.198s
  • 1
  • 2
  • 3
  • 4
  • 5

4. केचन परीक्षणप्रकरणाः त्यजन्तु
नूतनं परीक्षणकार्यं योजयन्तु

func TestAdd3(t *testing.T) {
	if testing.Short() {
        t.Skip("short模式下会跳过该测试用例")
    }
	
	result := Add(3, 2)
	expected := 5
	if result != expected {
		t.Errorf("Add(1,2) return %d, expected %d", result, expected)
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

निष्पादनकालेgo test -shorयदा त, तत् लङ्घितं भविष्यतिtesting.Short()चिह्नितं परीक्षणप्रकरणं, परिणामः अस्ति

go test -short -v
=== RUN   TestAdd
--- PASS: TestAdd (0.00s)
=== RUN   TestAdd2
--- PASS: TestAdd2 (0.00s)
=== RUN   TestAdd3
    calculator_test.go:23: short模式下会跳过该测试用例
--- SKIP: TestAdd3 (0.00s)
PASS
ok      modu    0.635s
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

3. परीक्षणसमूहाः उपपरीक्षाः च

३.१ परीक्षणसमूहाः उपपरीक्षाः च

परीक्षणसमूहानां उपपरीक्षाणां च माध्यमेन भवान् अधिकानि परीक्षणप्रकरणाः योजयितुं शक्नोति, परिणामान् च अधिकमैत्रीपूर्णरीत्या द्रष्टुं शक्नोति

func TestAdd(t *testing.T) {
	tests := []struct {
		name     string
		x, y     int
		expected int
	}{
		{"Add1", 1, 2, 3},
		{"Add2", 3, 3, 6},
		{"Add3", 4, 5, 8},
	}

	for _, tc := range tests {
		t.Run(tc.name, func(t *testing.T) {
			result := Add(tc.x, tc.y)
			if result != tc.expected {
				t.Errorf("Add(%d, %d) returned %d, expected %d", tc.x, tc.y, result, tc.expected)
			}
		})
	}
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

धावनं करोतुgo test -v,निष्क्रान्तः

go test -v
=== RUN   TestAdd
=== RUN   TestAdd/Add2
=== RUN   TestAdd/Add3
    calculator_test.go:51: Add(4, 5) returned 9, expected 8
--- FAIL: TestAdd (0.00s)
    --- PASS: TestAdd/Add1 (0.00s)
    --- PASS: TestAdd/Add2 (0.00s)
    --- FAIL: TestAdd/Add3 (0.00s)
FAIL
exit status 1
FAIL    modu    0.190s
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

३.२ समानान्तरपरीक्षणम्

Go भाषा स्वभावतः समवर्तीतां समर्थयति, अतः योजयित्वाt.Parallel()चालकपरीक्षाणां समानान्तरीकरणं प्राप्तुं।

func TestAdd(t *testing.T) {
	t.Parallel()  // 将 TLog 标记为能够与其他测试并行运行
	// 这里使用匿名结构体定义了若干个测试用例
	// 并且为每个测试用例设置了一个名称
	tests := []struct {
		name     string
		x, y     int
		expected int
	}{
		{"Add1", 1, 2, 3},
		{"Add2", 3, 3, 6},
		{"Add3", 4, 5, 8},
	}

	for _, tc := range tests {
		tc := tc  // 注意这里重新声明tt变量(避免多个goroutine中使用了相同的变量)
		t.Run(tc.name, func(t *testing.T) {
			t.Parallel()  // 将每个测试用例标记为能够彼此并行运行
			result := Add(tc.x, tc.y)
			if result != tc.expected {
				t.Errorf("Add(%d, %d) returned %d, expected %d", tc.x, tc.y, result, tc.expected)
			}
		})
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

३.३ परीक्षणव्याप्तिः

उपयुञ्जताम्‌go test -coverपरीक्षणकवरेजं द्रष्टुं

go test -cover
PASS
        modu    coverage: 100.0% of statements
ok      modu    1.149s
  • 1
  • 2
  • 3
  • 4

4. यूनिटपरीक्षणसाधनपुस्तिका गच्छन्तु – साक्ष्यं ददातु

Go भाषायां एककपरीक्षणं कुर्वन्, यतः आधिकारिकं प्रतिपादनकार्यं अन्तःनिर्मितं नास्ति, अस्माकं प्रायः बहुसंख्यायाः उपयोगः आवश्यकः भवतिif...else... परीक्षणपरिणामानां सत्यापनार्थं कथनम्।तथापि तृतीयपक्षपुस्तकालयानां उपयोगेन यथा...testify/assert, वयं सामान्यतया प्रयुक्तानि विविधानि प्रतिपादनकार्यं सहजतया आह्वयितुं शक्नुमः, ये न केवलं परीक्षणसङ्केतं सरलीकरोति, अपितु समस्यायाः शीघ्रं स्थानं ज्ञातुं स्पष्टं सुलभं च त्रुटिविवरणसूचनाम् अपि जनयन्ति

उपर्युक्ते उदाहरणे वयं प्रयुञ्ज्महेif...else...परीक्षणपरिणामस्य सत्यापनार्थं कथनम्

	for _, tc := range tests {
		t.Run(tc.name, func(t *testing.T) {
			result := Add(tc.x, tc.y)
			if result != tc.expected {
				t.Errorf("Add(%d, %d) returned %d, expected %d", tc.x, tc.y, result, tc.expected)
			}
		})
	}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

अधुना उपलब्धम्testify/assertउपर्युक्तं न्यायप्रक्रिया यथा सरलं भवति ।

	for _, tc := range tests {
		t.Run(tc.name, func(t *testing.T) {
			result := Add(tc.x, tc.y)
			assert.Equal(t, result, tc.expected)
		})
	}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

testify/requireअस्तिtestify/assertसर्वे प्रतिपादनकार्यं, तयोः मध्ये केवलं भेदः अस्तिtestify/requireयदि असफलः परीक्षणप्रकरणः सम्मुखीभवति तर्हि परीक्षणं तत्क्षणमेव समाप्तं भविष्यति ।