go的两大测试方法- 官网推荐

go的两大测试方法- 官网推荐

  • go的两大测试方法- 官网推荐
  • 常见的不正规测试方法
    • main方法个例测试验证 - 不正规
      • 1. 提供一个函数:`Reverse(input string)`进行测试
      • 2. 直接在函数下创建`main`函数下进行个例测试
      • 3. 测试发现,`Reverse`方法不支持某些汉字,因为汉字不是单字节!所以使用rune来装字符,所以增加了多一个方法`Reverse1`
      • 4. 再次在`main`中测试
      • 5. 经过测试后个例反转的效果是正确。但是个例毕竟还是个例。官网里面存在测试的使用教程。下面继续吧。
  • go官方推荐测试方式一
    • 单元unit 测试
      • 1. 新建一个go文件,要求文件命名为 待测试文件名 + _test.go
      • 2. 进行测试验证
      • 3. unit单元测试局限性:
      • 4. unit单元测试的优点
    • fuzz模糊测试
      • 1. 在fuzzingToLearn_test文件中添加模糊测试的代码 - 两个方法测试
      • 2. 终端运行测试
        • 1. 使用终端先使用run test验证是否通过
        • 2. 使用fuzz模糊测试验证,查看任何随机生成的字符串输入是否会导致失败
        • 3. 使用fuzz模糊测试FuzzReverse1方法,代码改动
        • 4. 使用fuzz验证
          • 诊断代码
  • end
    • 所有的代码:

go的两大测试方法- 官网推荐

常见的不正规测试方法

main方法个例测试验证 - 不正规

1. 提供一个函数:Reverse(input string)进行测试

2. 直接在函数下创建main函数下进行个例测试

package main

import (
	"fmt"
)

// Reverse 字节 反转字符串
func Reverse(input string) string {
	bytes := []byte(input)
	for i, j := 0, len(bytes)-1; i < len(bytes)/2; i, j = i+1, j-1 {
		bytes[i], bytes[j] = bytes[j], bytes[i]
	}
	return string(bytes)
}

func main() {

	input := "hello, world , java页, go bigdata"
	firstRev := Reverse(input)
	secondRev := Reverse(firstRev)
	fmt.Printf("原始数据: %q\n", input)
	fmt.Printf("第一次反转的数据: %q\n", firstRev)
	fmt.Printf("反转数据再次反转的数据: %q\n", secondRev)
}

3. 测试发现,Reverse方法不支持某些汉字,因为汉字不是单字节!所以使用rune来装字符,所以增加了多一个方法Reverse1

// Reverse1 字符(学习之前以为万事大吉,但是实际上这里仅限于utf-8的字符)
func Reverse1(input string) string {
	bytes := []rune(input)
	for i, j := 0, len(bytes)-1; i < len(bytes)/2; i, j = i+1, j-1 {
		bytes[i], bytes[j] = bytes[j], bytes[i]
	}
	return string(bytes)
}

4. 再次在main中测试

package main

import (
	"fmt"
)

// Reverse 字节 反转字符串
func Reverse(input string) string {
	bytes := []byte(input)
	for i, j := 0, len(bytes)-1; i < len(bytes)/2; i, j = i+1, j-1 {
		bytes[i], bytes[j] = bytes[j], bytes[i]
	}
	return string(bytes)
}

// Reverse1 字符(学习之前以为万事大吉,但是实际上这里仅限于utf-8的字符)
func Reverse1(input string) string {
	bytes := []rune(input)
	for i, j := 0, len(bytes)-1; i < len(bytes)/2; i, j = i+1, j-1 {
		bytes[i], bytes[j] = bytes[j], bytes[i]
	}
	return string(bytes)
}


func main() {

	input := "hello, world , java页, go bigdata"
	firstRev := Reverse(input)
	secondRev := Reverse(firstRev)
	fmt.Printf("原始数据: %q\n", input)
	fmt.Printf("第一次反转的数据: %q\n", firstRev)
	fmt.Printf("反转数据再次反转的数据: %q\n", secondRev)

	firstRev1 := Reverse1(input)
	secondRev1 := Reverse1(firstRev1)
	fmt.Printf("第一次反转的数据: %q\n", firstRev1)
	fmt.Printf("反转数据再次反转的数据: %q\n", secondRev1)
}

5. 经过测试后个例反转的效果是正确。但是个例毕竟还是个例。官网里面存在测试的使用教程。下面继续吧。


go官方推荐测试方式一

单元unit 测试

1. 新建一个go文件,要求文件命名为 待测试文件名 + _test.go

  • 我待测试文件名为fuzzingToLearn.go, 所以要新建的文件名为:fuzzingToLearn_test.go
  • 文件存在两个函数需要待验证,所以这里也编写了两个函数
  • 注意事项:
    • 测试方法名字规范: Test$functionName
    • 其中 f u n c t i o n N a m e 的首字母要改写为大写 ! 这里的 functionName的首字母要改写为大写!这里的 functionName的首字母要改写为大写!这里的functionName没有局限名字,保证首字母大写即可
package main

import (
	"testing"
	"unicode/utf8"
)

// 测试字节反转
func TestReverse(t *testing.T) {
	testcases := []struct {
		in, want string
	}{
		{"Hello, world", "dlrow ,olleH"},
		{" ", " "},
		{"!123456", "654321!"},
	}
	for _, tc := range testcases {
		rev := Reverse(tc.in)
		if rev != tc.want {
			t.Errorf("Reverse: %q, want %q", rev, tc.want)
		}
	}
}

// 测试字符反转
func TestReverse1(t *testing.T) {
	testcases := []struct {
		in, want string
	}{
		{"页Hello, world", "dlrow ,olleH页"},
		{" ", " "},
		{"!123456", "654321!"},
	}
	for _, tc := range testcases {
		rev := Reverse1(tc.in)
		if rev != tc.want {
			t.Errorf("Reverse: %q, want %q", rev, tc.want)
		}
	}
}

2. 进行测试验证

  • 切换到对应路径,在终端上运行go test -v命令;这个命令是测试所有的方法的,也有测试单个方法的:go test -v -test.run $测试方法名
  • Windowscmdpowershell都可以运行,其它操作系统的就不说了
  • 结果展示
PS D:\codes\go\goland-setting\test\fuzzing> ls


    目录: D:\codes\go\goland-setting\test\fuzzing


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----         2023/12/6     22:37           1661 fuzzingToLearn.go
-a----         2023/12/6     23:01           2197 fuzzingToLearn_test.go

PS D:\codes\go\goland-setting\test\fuzzing> go test -v
warning: GOPATH set to GOROOT (D:\install\go_install) has no effect
=== RUN   TestReverse
--- PASS: TestReverse (0.00s)
=== RUN   TestReverse1
--- PASS: TestReverse1 (0.00s)
PASS
ok      goland-setting/test/fuzzing     0.043s

3. unit单元测试局限性:

  • 每个输入必须由开发人员添加到测试中

4. unit单元测试的优点

  • 可以在线测试!!不像在main方法中进行测试的方式,需要停止程序,然后还要进行注释原有的代码
  • 官方是推荐的,但是这个不够精确!需要精确就使用fuzz测试吧

fuzz模糊测试

  • fuzz测试函数以Fuzz开头而不是Test开头

  • 方法参数和unit单元测试也不同,fuzz模糊测试为:f *testing.F

  • 为了方便,fuzz模糊测试直接在fuzzingToLearn_test.go文件进行

1. 在fuzzingToLearn_test文件中添加模糊测试的代码 - 两个方法测试

// FuzzReverse fuzz测试 字节-字符串反转
func FuzzReverse(f *testing.F) {
	testcases := []string{"Hello, world", " ", "!123456"}
	for _, tc := range testcases {
		f.Add(tc) // Use f.Add to provide a seed corpus
	}
	//对于字符会出错
	f.Fuzz(func(t *testing.T, orig string) {
		rev := Reverse(orig)
		doubleRev := Reverse(rev)
		if orig != doubleRev {
			t.Errorf("Before: %q, after: %q", orig, doubleRev)
		}
		if utf8.ValidString(orig) && !utf8.ValidString(rev) {
			t.Errorf("Reverse produced invalid UTF-8 string %q", rev)
		}
	})
}

// FuzzReverse1 fuzz测试 字符-字符串反转
func FuzzReverse1(f *testing.F) {
	testcases := []string{"Hello, world", " ", "!123456"}
	for _, tc := range testcases {
		f.Add(tc) // Use f.Add to provide a seed corpus
	}

	//非utf-8会出错
	f.Fuzz(func(t *testing.T, orig string) {
		rev := Reverse1(orig)
		doubleRev := Reverse1(rev)
		t.Logf("Number of runes: orig=%d, rev=%d, doubleRev=%d", utf8.RuneCountInString(orig),
			utf8.RuneCountInString(rev), utf8.RuneCountInString(doubleRev))
		if orig != doubleRev {
			t.Errorf("Before: %q, after: %q", orig, doubleRev)
		}
		if utf8.ValidString(orig) && !utf8.ValidString(rev) {
			t.Errorf("Reverse produced invalid UTF-8 string %q", rev)
		}
	})
}

2. 终端运行测试

  • 注意事项:
    • 使用fuzz模糊化时,你不能预测预期的输出,因为你不能控制输入
1. 使用终端先使用run test验证是否通过
PS D:\codes\go\goland-setting\test\fuzzing> go test
warning: GOPATH set to GOROOT (D:\install\go_install) has no effect
PASS
ok      goland-setting/test/fuzzing     0.041s

2. 使用fuzz模糊测试验证,查看任何随机生成的字符串输入是否会导致失败
# 第一次出错
PS D:\codes\go\goland-setting\test\fuzzing> go test -fuzz=Fuzz
warning: GOPATH set to GOROOT (D:\install\go_install) has no effect
testing: will not fuzz, -fuzz matches more than one fuzz test: [FuzzReverse FuzzReverse1]
FAIL
exit status 1
FAIL    goland-setting/test/fuzzing     0.041s

# 原因是一个文件只能有一个fuzz的测试例子。注释FuzzReverse1方法测试

PS D:\codes\go\goland-setting\test\fuzzing> go test -fuzz=Fuzz
warning: GOPATH set to GOROOT (D:\install\go_install) has no effect
fuzz: elapsed: 0s, gathering baseline coverage: 0/58 completed
failure while testing seed corpus entry: FuzzReverse/34d11aca3c8d1e0d
fuzz: elapsed: 0s, gathering baseline coverage: 2/58 completed
--- FAIL: FuzzReverse (0.09s)
    --- FAIL: FuzzReverse (0.00s)
        fuzzingToLearn_test.go:54: Reverse produced invalid UTF-8 string "\xab\xb0\xe7"

FAIL
exit status 1
FAIL    goland-setting/test/fuzzing     0.134s
# 结果是不通过,即测试失败
  • 结果:测试不通过,即有bug

  • 查看文件同目录产生了新的文件

    在这里插入图片描述

  • 文件内容为:

    go test fuzz v1
    string("簫")
    
  • 这里指的是不通过方法的测试。但是我们知道这个方法对于汉字就是有bug,我们先跳过,看一下第二个方法是否可行。

  • testdata目录可以删除的。但建议等完全测试后再删除

3. 使用fuzz模糊测试FuzzReverse1方法,代码改动
  • 由于一个文件不能存在多个fuzz方法,所以先注释上面的FuzzReverse函数的代码,打开FuzzReverse1函数的方法
// FuzzReverse1 fuzz测试 字符-字符串反转
func FuzzReverse1(f *testing.F) {
	testcases := []string{"Hello, world", " ", "!123456"}
	for _, tc := range testcases {
		f.Add(tc) // Use f.Add to provide a seed corpus
	}

	//非utf-8会出错
	f.Fuzz(func(t *testing.T, orig string) {
		rev := Reverse1(orig)
		doubleRev := Reverse1(rev)
		t.Logf("Number of runes: orig=%d, rev=%d, doubleRev=%d", utf8.RuneCountInString(orig),
			utf8.RuneCountInString(rev), utf8.RuneCountInString(doubleRev))
		if orig != doubleRev {
			t.Errorf("Before: %q, after: %q", orig, doubleRev)
		}
		if utf8.ValidString(orig) && !utf8.ValidString(rev) {
			t.Errorf("Reverse produced invalid UTF-8 string %q", rev)
		}
	})
}
4. 使用fuzz验证
PS D:\codes\go\goland-setting\test\fuzzing> go test -fuzz=Fuzz
warning: GOPATH set to GOROOT (D:\install\go_install) has no effect
fuzz: elapsed: 0s, gathering baseline coverage: 0/3 completed
fuzz: elapsed: 0s, gathering baseline coverage: 3/3 completed, now fuzzing with 16 workers
fuzz: minimizing 42-byte failing input file
fuzz: elapsed: 0s, minimizing
--- FAIL: FuzzReverse1 (0.15s)
    --- FAIL: FuzzReverse1 (0.00s)
        fuzzingToLearn_test.go:70: Number of runes: orig=1, rev=1, doubleRev=1
        fuzzingToLearn_test.go:73: Before: "\x86", after: "�"

    Failing input written to testdata\fuzz\FuzzReverse1\0cca6a19caba34b5
    To re-run:
    go test -run=FuzzReverse1/0cca6a19caba34b5
FAIL
exit status 1
FAIL    goland-setting/test/fuzzing     0.525s
# 还是出错了。而且前后两个值不同!!!
  • 同样的还是生成了文件

    在这里插入图片描述

  • 说明FuzzReverse1函数也有bug

诊断代码
  • 经过了解:

    • 在Go语言中,字符串是一个只读的字节片,可以包含非UTF-8有效的字节。原始字符串是一个字节切片,其中有一个字节, '\x86' 。当输入字符串被设置为 []rune 时,Go语言将字节切片编码为UTF-8,并将字节替换为UTF-8字符。当我们将替换UTF-8字符与输入字节片进行比较时,它们显然不相等。
  • 所以,我们需要修改我们的函数代码。但是此处为了保留之前的代码,就直接增加一个函数即可。添加到fuzzingToLearn.go文件,然后再再进行测试该方法即可。

  1. 增加函数Reverse2,内容如下
// Reverse2 排除不是utf-8字符
func Reverse2(input string) (string, error) {
	if !utf8.ValidString(input) {
		return input, errors.New("input is not valid UTF-8")
	}
	runes := []rune(input)
	for i, j := 0, len(runes)-1; i < len(runes)/2; i, j = i+1, j-1 {
		runes[i], runes[j] = runes[j], runes[i]
	}
	return string(runes), nil
}
  1. fuzzingToLearn_test.go文件添加对应的fuzz模糊测试函数FuzzReverse2
// 注释FuzzReverse1(f *testing.F)方法,增加下面内容
// fuzz测试 字符串反转 字符,排除非utf-8字符
func FuzzReverse2(f *testing.F) {
	testcases := []string{"Hello, world", " ", "!123456"}
	for _, tc := range testcases {
		f.Add(tc) // Use f.Add to provide a seed corpus
	}

	f.Fuzz(func(t *testing.T, orig string) {
		rev, err1 := Reverse2(orig)
		if err1 != nil {
			return // 可以调用 t.Skip()
		}
		doubleRev, err2 := Reverse2(rev)
		if err2 != nil {
			return // 可以调用 t.Skip()
		}
		if orig != doubleRev {
			t.Errorf("Before: %q, after: %q", orig, doubleRev)
		}
		if utf8.ValidString(orig) && !utf8.ValidString(rev) {
			t.Errorf("Reverse produced invalid UTF-8 string %q", rev)
		}
	})
}

  1. 这里就跳过了前面所介绍的两种测试验证,直接进行fuzz模糊测试

  2. 这里是只先验证错误的情况,即新增加的testdata目录下的文件内容情况。使用go test -run命令

PS D:\codes\go\goland-setting\test\fuzzing> go test -run=FuzzReverse1/0cca6a19caba34b5
warning: GOPATH set to GOROOT (D:\install\go_install) has no effect
testing: warning: no tests to run
PASS
ok      goland-setting/test/fuzzing     0.357s
# success
  1. 再次运行go test -fuzz=Fuzz
PS D:\codes\go\goland-setting\test\fuzzing> go test -fuzz=Fuzz
warning: GOPATH set to GOROOT (D:\install\go_install) has no effect
fuzz: elapsed: 0s, gathering baseline coverage: 0/3 completed
fuzz: elapsed: 0s, gathering baseline coverage: 3/3 completed, now fuzzing with 16 workers
fuzz: elapsed: 3s, execs: 1212471 (404034/sec), new interesting: 32 (total: 35)
fuzz: elapsed: 6s, execs: 2590247 (458435/sec), new interesting: 35 (total: 38)
fuzz: elapsed: 9s, execs: 3933396 (448061/sec), new interesting: 35 (total: 38)
fuzz: elapsed: 12s, execs: 5262110 (442525/sec), new interesting: 35 (total: 38)
fuzz: elapsed: 15s, execs: 6555446 (431581/sec), new interesting: 35 (total: 38)
fuzz: elapsed: 18s, execs: 7789113 (411424/sec), new interesting: 36 (total: 39)
fuzz: elapsed: 21s, execs: 9042454 (416817/sec), new interesting: 36 (total: 39)
fuzz: elapsed: 22s, execs: 9511996 (407607/sec), new interesting: 36 (total: 39)
PASS
ok      goland-setting/test/fuzzing     22.581s

  1. go test -fuzz=Fuzz不会自动停止,需要CTRL + c来停止;或者运行go test -fuzz=Fuzz -fuzztime 20s来指定20s后结束
PS D:\codes\go\goland-setting\test\fuzzing> go test -fuzz=Fuzz -fuzztime 20s
warning: GOPATH set to GOROOT (D:\install\go_install) has no effect
fuzz: elapsed: 0s, gathering baseline coverage: 0/43 completed
fuzz: elapsed: 0s, gathering baseline coverage: 43/43 completed, now fuzzing with 16 workers
fuzz: elapsed: 3s, execs: 1332436 (442300/sec), new interesting: 0 (total: 43)
fuzz: elapsed: 6s, execs: 2701841 (458040/sec), new interesting: 0 (total: 43)
fuzz: elapsed: 9s, execs: 4096713 (463975/sec), new interesting: 0 (total: 43)
fuzz: elapsed: 12s, execs: 5449685 (451464/sec), new interesting: 0 (total: 43)
fuzz: elapsed: 15s, execs: 6755971 (435062/sec), new interesting: 0 (total: 43)
fuzz: elapsed: 18s, execs: 8075349 (439717/sec), new interesting: 0 (total: 43)
fuzz: elapsed: 20s, execs: 8927301 (403763/sec), new interesting: 0 (total: 43)
PASS
ok      goland-setting/test/fuzzing     20.214s

end

所有的代码:

  • fuzzingToLearn.go
package main

import (
	"errors"
	"fmt"
	"unicode/utf8"
)

// Reverse 字节 反转字符串
func Reverse(input string) string {
	bytes := []byte(input)
	for i, j := 0, len(bytes)-1; i < len(bytes)/2; i, j = i+1, j-1 {
		bytes[i], bytes[j] = bytes[j], bytes[i]
	}
	return string(bytes)
}

// Reverse1 字符(学习之前以为万事大吉,但是实际上这里仅限于utf-8的字符)
func Reverse1(input string) string {
	bytes := []rune(input)
	for i, j := 0, len(bytes)-1; i < len(bytes)/2; i, j = i+1, j-1 {
		bytes[i], bytes[j] = bytes[j], bytes[i]
	}
	return string(bytes)
}

// Reverse2 排除不是utf-8字符
func Reverse2(input string) (string, error) {
	if !utf8.ValidString(input) {
		return input, errors.New("input is not valid UTF-8")
	}
	runes := []rune(input)
	for i, j := 0, len(runes)-1; i < len(runes)/2; i, j = i+1, j-1 {
		runes[i], runes[j] = runes[j], runes[i]
	}
	return string(runes), nil
}

func main() {

	input := "hello, world , java页, go bigdata"
	firstRev := Reverse(input)
	secondRev := Reverse(firstRev)
	fmt.Printf("原始数据: %q\n", input)
	fmt.Printf("第一次反转的数据: %q\n", firstRev)
	fmt.Printf("反转数据再次反转的数据: %q\n", secondRev)

	firstRev1 := Reverse1(input)
	secondRev1 := Reverse1(firstRev1)
	fmt.Printf("第一次反转的数据: %q\n", firstRev1)
	fmt.Printf("反转数据再次反转的数据: %q\n", secondRev1)

	firstRev2, firstRev2Err := Reverse2(input)
	secondRev2, secondRevErr := Reverse2(firstRev2)
	fmt.Printf("第一次反转的数据: %q, err: %v\n", firstRev2, firstRev2Err)
	fmt.Printf("反转数据再次反转的数据: %q, err: %v\n", secondRev2, secondRevErr)
}

  • fuzzingToLearn_test.go
package main

import (
	"testing"
	"unicode/utf8"
)

func TestReverse(t *testing.T) {
	testcases := []struct {
		in, want string
	}{
		{"Hello, world", "dlrow ,olleH"},
		{" ", " "},
		{"!123456", "654321!"},
	}
	for _, tc := range testcases {
		rev := Reverse(tc.in)
		if rev != tc.want {
			t.Errorf("Reverse: %q, want %q", rev, tc.want)
		}
	}
}

func TestReverse1(t *testing.T) {
	testcases := []struct {
		in, want string
	}{
		{"页Hello, world", "dlrow ,olleH页"},
		{" ", " "},
		{"!123456", "654321!"},
	}
	for _, tc := range testcases {
		rev := Reverse1(tc.in)
		if rev != tc.want {
			t.Errorf("Reverse: %q, want %q", rev, tc.want)
		}
	}
}

// FuzzReverse fuzz测试 字节-字符串反转
//func FuzzReverse(f *testing.F) {
//	testcases := []string{"Hello, world", " ", "!123456"}
//	for _, tc := range testcases {
//		f.Add(tc) // Use f.Add to provide a seed corpus
//	}
//	//对于字符会出错
//	f.Fuzz(func(t *testing.T, orig string) {
//		rev := Reverse(orig)
//		doubleRev := Reverse(rev)
//		if orig != doubleRev {
//			t.Errorf("Before: %q, after: %q", orig, doubleRev)
//		}
//		if utf8.ValidString(orig) && !utf8.ValidString(rev) {
//			t.Errorf("Reverse produced invalid UTF-8 string %q", rev)
//		}
//	})
//}

// FuzzReverse1 fuzz测试 字符-字符串反转
//func FuzzReverse1(f *testing.F) {
//	testcases := []string{"Hello, world", " ", "!123456"}
//	for _, tc := range testcases {
//		f.Add(tc) // Use f.Add to provide a seed corpus
//	}
//
//	//非utf-8会出错
//	f.Fuzz(func(t *testing.T, orig string) {
//		rev := Reverse1(orig)
//		doubleRev := Reverse1(rev)
//		t.Logf("Number of runes: orig=%d, rev=%d, doubleRev=%d", utf8.RuneCountInString(orig),
//			utf8.RuneCountInString(rev), utf8.RuneCountInString(doubleRev))
//		if orig != doubleRev {
//			t.Errorf("Before: %q, after: %q", orig, doubleRev)
//		}
//		if utf8.ValidString(orig) && !utf8.ValidString(rev) {
//			t.Errorf("Reverse produced invalid UTF-8 string %q", rev)
//		}
//	})
//
//}

// fuzz测试 字符串反转 字符,排除非utf-8字符
func FuzzReverse2(f *testing.F) {
	testcases := []string{"Hello, world", " ", "!123456"}
	for _, tc := range testcases {
		f.Add(tc) // Use f.Add to provide a seed corpus
	}

	f.Fuzz(func(t *testing.T, orig string) {
		rev, err1 := Reverse2(orig)
		if err1 != nil {
			return // 可以调用 t.Skip()
		}
		doubleRev, err2 := Reverse2(rev)
		if err2 != nil {
			return // 可以调用 t.Skip()
		}
		if orig != doubleRev {
			t.Errorf("Before: %q, after: %q", orig, doubleRev)
		}
		if utf8.ValidString(orig) && !utf8.ValidString(rev) {
			t.Errorf("Reverse produced invalid UTF-8 string %q", rev)
		}
	})
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/226915.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AZURE==SQL managed instances

创建资源 创建DB 创建完成后&#xff0c;拿着刚才的账号密码依然连接不上 远程连接 需要开启公网访问和开放相关端口 参考Configure public endpoint - Azure SQL Managed Instance | Microsoft Learn 连接成功

微信小程序 跳转界面,选择货物之后,返回上一页带参数并判断参数是否存在

需求 当刚进来时选择货物&#xff0c;跳转到选择货物界面进行货物选择&#xff0c;如果货物重复&#xff0c;不再新增货物&#xff0c;如果不存在&#xff0c;则新增 prevPage.setData()用于在页面之间传递数据。它将数据设置到上一个页面&#xff08;即prevPage&#xff09;的…

生成式AI赋能千行百业加速创新,2023亚马逊云科技re:Invent行业盘点

2023亚马逊云科技re:Invent全球大会已于上周圆满闭幕&#xff0c;在本次大会中&#xff0c;亚马逊云科技又为大家带来了很多功能/项目迭代更新&#xff0c;也重磅发布了很多全新的功能。今天从行业视角来盘点回顾哪些重磅发布适用于垂直行业客户&#xff0c;以及面向汽车、制造…

python可视化plotly 图例(legend)设置大全,值得收藏!

文章目录 一、图例(legend)二、update\_layout(legend{}) 相关参数及示例关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③Python小游戏源码五、面试资料六、Python…

听GPT 讲Rust源代码--src/tools(8)

File: rust/src/tools/rust-analyzer/crates/ide-assists/src/handlers/add_missing_match_arms.rs 在Rust源代码中&#xff0c;rust-analyzer是一个Rust编程语言的语言服务器。它提供了代码补全、代码重构和代码导航等功能来帮助开发者提高编码效率。 在rust-analyzer的代码目…

轻松掌握ArkTS!鸿蒙新作《鸿蒙HarmonyOS应用开发入门》简介

《鸿蒙HarmonyOS应用开发入门》由清华大学出版社出版&#xff0c;已于近期上市。该书基于HarmonyOS 3.1 ArkTS编写&#xff0c;所有示例采用了比较新的API 9&#xff0c;可谓是目前市面上最新的鸿蒙力作。 本文对《鸿蒙HarmonyOS应用开发入门》一书做个大致的介绍。 封面部分…

Vulnhub项目:EMPIRE: BREAKOUT

一、靶机地址 靶机地址&#xff1a;Empire: Breakout ~ VulnHub 靶机介绍&#xff1a; 该靶机被定义为简单&#xff0c;但是如果没有找到&#xff0c;那就难度成中等了&#xff01; 二、渗透过程 老三样&#xff0c;发现目标&#xff0c;这里用 arp-scan 确定靶机 ip&#…

17:00面试,17:06就出来了,问的问题有点变态。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到8月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%,…

【web开发网页制作】Html+Css网页制作关于明星介绍王嘉尔(5页面)【附源码下载】

htmlcss网页制作目录 写在前面涉及知识效果展示1、网页构思2、网页实现2.1 首页2.2 关于我2.3 成长经历2.4 朋友2.5 爱好 3、源码分享 写在前面 接着分享哈&#xff0c;还是学生时代的库存&#xff0c;当时是为了不同风格的素材&#xff0c;所以自己选择了多个方向的主题来练习…

计算机操作系统4

1.什么是进程同步 2.什么是进程互斥 3.进程互斥的实现方法(软件) 4.进程互斥的实现方法(硬件) 5.遵循原则 6.总结&#xff1a; 线程是一个基本的cpu执行单元&#xff0c;也是程序执行流的最小单位。 调度算法&#xff1a;先来先服务FCFS、短作业优先、高响应比优先、时间片…

人工智能_机器学习061_KKT条件公式理解_原理深度解析_松弛变量_不等式约束---人工智能工作笔记0101

然后我们再来看,前面我们,拉格朗日乘子法,把带有条件的,问题,优化成了等式问题,从而, 构建拉格朗日乘子公式,进行实现了求解,但是在现实生活中,往往也有,很多不等式问题. 比如上面的这个,就是要求是h(x)<=0的情况下,函数f(x)的最小值. 可以看到,这个带有一个不等式的条件,…

『亚马逊云科技产品测评』活动征文|AWS云服务器EC2实例实现ByConity快速部署

授权声明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 Developer Centre, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道 前言 亚马逊是全球最大的在线零售商和云计算服务提供商。AWS云服务器在…

四、分代垃圾回收机制及垃圾回收算法

学习垃圾回收的意义 Java 与 C等语言最大的技术区别&#xff1a;自动化的垃圾回收机制&#xff08;GC&#xff09; 为什么要了解 GC 和内存分配策略 1、面试需要 2、GC 对应用的性能是有影响的&#xff1b; 3、写代码有好处 栈&#xff1a;栈中的生命周期是跟随线程&…

公司文档防泄密新招!上海迅软DSE揭秘电脑文档加密绝技!

面对频频案发的企业文档泄露事件&#xff0c;各企业该如好保护好文档安全呢&#xff1f; 1、进行文档加密&#xff0c;防止机密外泄 现在勒索病毒组织经常以公开机密信息威胁企业支付赎金&#xff0c;如果事先对重要文档加密保护&#xff0c;可以很好防止重要文档被公开。 迅软…

Python中的并发编程(2)线程的实现

Python中线程的实现 1. 线程 在Python中&#xff0c;threading 库提供了线程的接口。我们通过threading 中提供的接口创建、启动、同步线程。 例1. 使用线程旋转指针 想象一个场景&#xff1a;程序执行了一个耗时较长的操作&#xff0c;如复制一个大文件&#xff0c;我们希…

Ngnix和Apache配置SSL证书

本文主要介绍Ngnix和Apache配置SSL证书的方法 目录 SSL证书SSL证书的作用Ngnix简介Ngnix配置SSL证书Apache简介Apache配置SSL证书 SSL证书 SSL证书是一种数字证书&#xff0c;用于加密在网络上发送的数据并保护敏感信息的安全性。SSL代表“安全套接字层”&#xff0c;它是一种…

12.7 作业

1&#xff0c; #include "widget1.h"Widget1::Widget1(QWidget *parent): QWidget(parent) {//界面设置//修改界面大小this->resize(810,600);//固定界面大小this->setFixedSize(800,600);//修改界面的标题this->setWindowTitle("杰哥和阿伟专场"…

Makefile语法

一、Makefile规则格式 Makefile 里面是由一系列的规则组成的&#xff0c;这些规则格式如下&#xff1a; 目标…... : 依赖文件集合…… 命令 1 命令 2 ……参考上一节gcc编译器与Makefile入门参考这条规则 1 main: main.o input.o calcu.o2 gcc -o main main.o input.o c…

采样率越高噪声越大?

ADC采样率指的是模拟到数字转换器&#xff08;ADC&#xff09;对模拟信号进行采样的速率。在数字信号处理系统中&#xff0c;模拟信号首先通过ADC转换为数字形式&#xff0c;以便计算机或其他数字设备能够处理它们。 ADC采样率通常以每秒采样的次数来表示&#xff0c;单位为赫…

详解http请求头,响应头以及在实际开发中

HTTP (Hypertext Transfer Protocol) 协议是一种用于传输超文本的标准协议&#xff0c;它是 Web 通信的基础。HTTP 协议是无状态的&#xff0c;即每次请求是相互独立的&#xff0c;服务器不会记住上一次请求的信息。HTTP 协议采用客户端-服务器模式&#xff0c;客户端发起请求&…