我在测试我的项目时遇到了数据竞争警告,想知道是否有人愿意帮助我解决这个问题。我过去从未尝试过测试 go 例程,并且发现很难理解数据竞争。
我在描述中提供了未解决问题的链接,并在问题描述中提供了跟踪。
我真的很感激一些帮助,只是从学习调试类似问题和将来为 go 例程编写更好的测试方面来看。
https://github.com/nitishm/vegeta-server/issues/52
下面还提供了跟踪片段
=== RUN Test_dispatcher_Cancel_Error_completed
INFO[0000] creating new dispatcher component=dispatcher
INFO[0000] starting dispatcher component=dispatcher
INFO[0000] dispatching new attack ID=d63a79ac-6f51-486e-845d-077c8c76168a Status=scheduled component=dispatcher
==================
WARNING: DATA RACE
Read at 0x00c0000f8d68 by goroutine 8:
vegeta-server/internal/dispatcher.(*task).Complete()
/Users/nitishm/vegeta-server/internal/dispatcher/task.go:116 +0x61
vegeta-server/internal/dispatcher.run()
/Users/nitishm/vegeta-server/internal/dispatcher/task.go:213 +0x17a
Previous write at 0x00c0000f8d68 by goroutine 7:
vegeta-server/internal/dispatcher.(*task).Run()
/Users/nitishm/vegeta-server/internal/dispatcher/task.go:107 +0x12a
vegeta-server/internal/dispatcher.(*dispatcher).Run()
/Users/nitishm/vegeta-server/internal/dispatcher/dispatcher.go:109 +0xb5f
Goroutine 8 (running) created at:
vegeta-server/internal/dispatcher.(*task).Run()
/Users/nitishm/vegeta-server/internal/dispatcher/task.go:105 +0x11c
vegeta-server/internal/dispatcher.(*dispatcher).Run()
/Users/nitishm/vegeta-server/internal/dispatcher/dispatcher.go:109 +0xb5f
Goroutine 7 (running) created at:
vegeta-server/internal/dispatcher.Test_dispatcher_Cancel_Error_completed()
/Users/nitishm/vegeta-server/internal/dispatcher/dispatcher_test.go:249 +0x545
testing.tRunner()
/usr/local/go/src/testing/testing.go:827 +0x162
================== …Run Code Online (Sandbox Code Playgroud) 是否有任何使用 testify 编写干净的表驱动测试的示例。输入和预期输出的表驱动测试效果很好,但必须测试依赖项的输出似乎真的很难做到。
下面的示例使用一个模拟接口,并要求我编写一个全新的测试函数来验证被测函数是否正确处理依赖项错误。我只是在寻找建议,使使用 testify 模拟包编写单元测试更加简化。
package packageone
import (
"errors"
"musings/packageone/mocks"
"testing"
)
//Regular Table driven test
func TestTstruct_DoSomething(t *testing.T) {
testObj := new(mocks.Dinterface)
passes := []struct {
Input int
Output int
}{{0, 0}, {1, 1}, {2, 4}, {100, 10000}}
for _, i := range passes {
testObj.On("DoSomethingWithD", i.Input).Return(i.Output, nil)
}
type fields struct {
DC Dinterface
}
type args struct {
i int
}
tests := []struct {
name string
fields fields
args args
wantRes int
wantErr bool …Run Code Online (Sandbox Code Playgroud) 一个接口有多少分配给它的功能有什么问题吗?
在我读到的任何地方,接口理想情况下应该只有一个方法(接口应该以之后命名).但是,对于接口有多种方法,是否有任何陷阱?防爆.
type FooMgrInterface interface {
CreateFoo(hostname string, fooConfig interface{}) (uuid string, err error)
DeleteFoo(hostname string, fooID string) (err error)
CreateBar(hostname string, barID string, barConfig interface{}) (uuid string, err error)
DeleteBar(hostname string, barID string) (err error)
AttachBar(hostname string, fooID string, bars []string) (err error)
DetachBar(hostname string, barID string) (err error)
GetBars(hostname string) (bars []Bar, err error)
GetBar(hostname string, barID string) (bar Bar, err error)
GetFoo(hostname string, fooID string) (foo Foo, err error)
GetFoos(hostname string) (foos []Foo, err error)
}
Run Code Online (Sandbox Code Playgroud)
如果是这样,上面的接口如何简化或(可能)分成多个接口?
每次我使用 UpdateView 并尝试更改某些属性时,它都会使用新的唯一主键在我的数据库中创建一个新对象。我的模型如下。
class Delivery(models.Model):
created_date = models.DateTimeField('date created', editable=False)
modified_date = models.DateTimeField('modified', editable=False)
user_name = models.ForeignKey(User, null=False)
stream_name = models.CharField(max_length=50, null=False)
view_name = models.CharField(max_length=100, null=False, blank=True)
activity_name = models.CharField(max_length=100, null=False, blank=True)
jira = models.URLField()
codereview = models.URLField()
related_streams = models.CharField(max_length = 100, choices=sorted(streams()))
description = models.TextField(null=False,blank=True)
status = models.BooleanField(default=False, blank=False)
class Meta:
verbose_name = "Delivery"
verbose_name_plural = "Deliveries"
unique_together = (("user_name", "view_name", "activity_name"),)
Run Code Online (Sandbox Code Playgroud)
对于表单,我使用 UpdateView 默认使用的 ModelFactoryForm 来选择使用模型本身的 form_class。
class UpdateEntryView(UpdateView):
template_name = 'tracker/update.html'
model = Delivery
success_url = …Run Code Online (Sandbox Code Playgroud) go ×3
testing ×2
data-race ×1
django ×1
django-forms ×1
goroutine ×1
idiomatic ×1
mocking ×1
table-driven ×1
testify ×1