我正在构建一个微服务应用程序,目前正在编写一些测试。下面是我正在测试的函数,它由cart
服务所有,并尝试获取所有购物车项目,并将项目详细信息与catalog
服务中每个项目的其他详细信息一起附加。
func (s *Server) Grpc_GetCartItems(ctx context.Context, in *pb.GetCartItemsRequest) (*pb.ItemsResponse, error) {
// Get product ids and its quantity in cart by userId
res, err := s.Repo.GetCartItems(ctx, in.UserId)
if err != nil {
return nil, err
}
// Return empty response if there is no items in cart
if len(res) == 0 {
return &pb.ItemsResponse{}, nil
}
// Get Product ID Keys from map
ids := GetMapKeys(res)
// RPC call catalog server to get cart products' names
products, err := s.CatalogClient.Grpc_GetProductsByIds(ctx, &catalogpb.GetProductsByIdsRequest{ProductIds: ids})
if err != nil{
return nil, err
}
// Return response in format product id, product name, and qty in cart
items, err := AppendItemToResponse(products, res)
if err != nil{
return nil, err
}
return items, nil
}
问题是对于测试设置,我需要将一些测试数据播种到cart
和catalog
存储库中。我可以用cart
repo很好地做到这一点,但对于catalog
来说,只模拟依赖关系s.CatalogClient.Grpc_GetProductsByIds
是一种常见的做法吗?我对测试还是个新手,据我所知,你通常不会在集成测试中嘲笑我,但我不确定是否有更好的方法来解决这类问题。
对于集成测试,您不会模拟服务,这是正确的。
通常,如果它是一个您无法控制的服务,您会截断该服务。
集成测试可以针对分段或测试服务(在E2E容量中(或在虚拟环境(如compose、K8S等(中运行
我想对于你的要求,我会用docker compose或类似的东西来展示它。如果你打算在未来进行E2E设置,你可能需要考虑一个测试环境。
请参阅:https://www.testenvironmentmanagement.com/types-of-testing-environments/
强制性"你不应该直接从另一个微服务中调用一个"微服务";议论虽然您可以找到一种使测试工作的方法,但您已经将体系结构紧密耦合在一起了。由于cart
服务与catalog
服务直接相关,因此这种(测试(问题只是众多问题中的第一个。如果您修复了紧密耦合的体系结构问题,那么您的测试问题也将得到解决。