当前位置: 首页 > 知识库问答 >
问题:

如何检查函数在测试中被调用了多少次?

常乐
2023-03-14

我正在使用一个调用函数的API开发一个web服务器。这个函数的任务很繁重,并且会缓存结果。我的设计方式是,如果没有缓存,并且多个用户同时使用相同的参数调用此API,服务器只为第一个请求调用该函数一次,所有其他请求等待完成作业并从缓存返回响应。

我用这种方式写了一个测试:


func TestConcurentRequests(t *testing.T) {
    var wg sync.WaitGroup
    for i := 0; i < 10; i++ {
        wg.Add(1)
        go func() {
            // do the request
            wg.Done()
        }
    }
    wg.Wait()
}

我可以通过在这个沉重的函数中打印一个值来检查我的代码是否正常工作,并检查控制台,看看它是否只出现一次,但是如果这个函数被调用了更多次,我正在寻找一种方法来失败测试。比如:

if n := NumberOfCalls(MyHeavyFunction); n > 1 {
    t.Fatalf("Expected heavy function to run only once but called %d times", n)
}

共有1个答案

蒋骏
2023-03-14

我建议把你的重功能分为缓存部分和实际处理部分。在这里,缓存部分将是并发客户端的门面。这里测试的系统实际上是缓存层,它决定是转发请求、保持还是从缓存返回。因此,为了测试这一点,您需要模拟进行处理的实际函数,并且模拟应该记录它服务了多少个请求。

以下是带有某些假设的演示:

package main

import "fmt"

func CreateCachedProcessor(processor Processing) func(string) string {
    //cache here
    return func(req string) string {
        //Assume you have some logic to call the actual processor based on your conditions
        return processor.ProcessRequest(req)
    }
}

type Processing interface {
    ProcessRequest(string) string
}

type HeavyProcessing struct{}

func (p *HeavyProcessing) ProcessRequest(request string) string {
    return "response"
}

type HeavyProcessingRecorder struct {
    Count int
}

func (p *HeavyProcessingRecorder) ProcessRequest(request string) string {
    p.Count += 1
    return "response recorded"
}

func main() {

    //normal
    hp := &HeavyProcessing{}
    c := CreateCachedProcessor(hp)
    fmt.Println(c("req1"))

    //Test with recorder
    hpr := &HeavyProcessingRecorder{}
    cr := CreateCachedProcessor(hpr)
    cr("req1")
    cr("req1")
    cr("req1")
    fmt.Println("No. of times Called ", hpr.Count)

}
 类似资料:
  • 我正在测试路由器,有两个函数,我需要测试第一个函数是否被调用,第二个函数是否被调用。有方法

  • 假设我们有一个函数和另一个函数 我们希望编写一个Unit测试,检查是否调用了的次数和正确的参数。 那里有 但这只是指最后一次通话。所以假设调用,然后,调用的断言是。 此外,还有 这将生成一个包含正确参数的对象列表。将这个列表与我们在单元测试中创建的对象进行比较,感觉是一件非常讨厌的事情<代码>调用似乎是模拟库的一个内部类。 有更好的方法吗?我使用这个设置来测试函数的并行执行。

  • 我想为整个Kafka流编写一个集成测试。 在我的生产代码中,我有: 在我的测试代码中,我使用KafkaProducer 我希望有一个钩子,表明调用了KafkaListener。我可以在测试中加入一些延迟,但这是一个糟糕的做法,我想避免它。 有没有更好的方法来等待正在处理的?

  • 问题内容: 对于测试,我使用jest和react-test-renderer。测试应该很简单,但是我很难找到合适的例子。我试图做这样的事情(通常我将功能保存在单独的文件中): utils.js utils.test.js 片段 const childFunction = jest.fn(); 绝对行不通。调用时,parentFunction的主体仅关心其自身的作用域。但是,如果我导入childFu

  • 我正在使用Jest测试一些实用函数。 my_util.js: 另一个例子。js: 测试调用了的最简单方法是什么?这是我当前的单元测试,它失败了。有没有一种方法可以测试函数是否以其名称调用? 结果:

  • 我使用java-jar-jenkins。战争和java-jar奴隶。jar负责管理Jenkins的主人和奴隶。我想知道Jenkins调用了多少JVM,我可以配置它们的参数。 在大师: 我认为只有一个JVM(我不在master中运行作业) 在从属中: java-jar从机。罐子= 另一个问题是,我可以在管理节点的高级部分为从机设置JVM,但是谁使用它的配置?