首页 > 其他分享 >Go-kratos框架商城微服务实战四

Go-kratos框架商城微服务实战四

时间:2024-07-29 21:55:14浏览次数:15  
标签:kratos log err resp assert NoError Go http 商城

Go-kratos 框架商城微服务实战四

接口测试,这里采用 testify 进行断言测试

  • 新建/test/目录
  • 新建 /test/user_grpc_test.go
package main

import (
	"context"
	"log"
	"os"
	"testing"
	"time"

	v1 "user/api/user/v1" // 导入 user client

	"github.com/go-kratos/kratos/contrib/registry/consul/v2"
	"github.com/go-kratos/kratos/v2/transport/grpc"
	"github.com/hashicorp/consul/api"
	"github.com/stretchr/testify/assert"
	"gopkg.in/yaml.v3"
)

type Config struct {
    Consul struct {
        Address string `yaml:"address"`
        Scheme  string `yaml:"scheme"`
    } `yaml:"consul"`
}

func setupGRPCClient(t *testing.T) v1.UserClient {
	c := api.DefaultConfig()
	data, err := os.ReadFile("../configs/registry.yaml")
	if err != nil {
		log.Fatalf("error: %v", err)
	}

	// 将读取的YAML数据解析到变量中
	var config Config
    err = yaml.Unmarshal(data, &config)
    if err != nil {
        log.Fatalf("error: %v", err)
    }
	c.Address = config.Consul.Address
	c.Scheme = "http"
	consulCli, err := api.NewClient(c)
	assert.NoError(t, err)

	r := consul.New(consulCli)

	// new grpc client
	conn, err := grpc.DialInsecure(
		context.Background(),
		grpc.WithEndpoint("discovery:///user"),
		grpc.WithDiscovery(r),
	)
	assert.NoError(t, err)
	t.Cleanup(func() { conn.Close() })
	return v1.NewUserClient(conn) // 使用 UserClient
}

func TestCreateUser(t *testing.T) {
	gClient := setupGRPCClient(t)
	time.Sleep(time.Second)
	rsp, err := gClient.CreateUser(context.Background(), &v1.CreateUserRequest{
		Mobile:   "1381210110",
		Password: "password",
		NickName: "nickname",
	})
	assert.NoError(t, err)
	assert.NotNil(t, rsp)
	assert.Equal(t, "1381210110", rsp.Mobile)
	log.Printf("[grpc] CreateUser %+v\n", rsp)
}

func TestUpdateUser(t *testing.T) {
	gClient := setupGRPCClient(t)
	time.Sleep(time.Second)
	rsp, err := gClient.UpdateUser(context.Background(), &v1.UpdateUserRequest{
		Id:       1,
		Mobile:   "138110110",
		Password: "newpassword",
		NickName: "newnickname",
	})
	assert.NoError(t, err)
	assert.NotNil(t, rsp)
	assert.Equal(t, "138110110", rsp.Mobile)
	log.Printf("[grpc] UpdateUser %+v\n", rsp)
}

  • 新建 /test/user_http_test.go
package main

import (
	"bytes"
	"encoding/json"
	"io"
	"log"
	"net/http"
	"testing"
	"time"

	"github.com/golang-jwt/jwt/v5"
	"github.com/stretchr/testify/assert"
)

var jwtKey = []byte("testKey")

func setupHTTPClient() *http.Client {
	return &http.Client{
		Timeout: time.Second * 10,
	}
}

func generateJWT() (string, error) {
	token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
		"exp": time.Now().Add(time.Hour * 1).Unix(),
		"iat": time.Now().Unix(),
	})
	return token.SignedString(jwtKey)
}

func TestCreateUserHTTP(t *testing.T) {
	hClient := setupHTTPClient()

	reqBody, err := json.Marshal(map[string]string{
		"mobile":   "1381121120",
		"password": "password",
		"nickName": "nickname",
		"role":     "0",
	})
	assert.NoError(t, err)

	token, err := generateJWT()
	assert.NoError(t, err)

	req, err := http.NewRequest("POST", "http://127.0.0.1:8002/v1/users", bytes.NewBuffer(reqBody))
	assert.NoError(t, err)
	req.Header.Set("Content-Type", "application/json")
	req.Header.Set("Authorization", "Bearer "+token) // 使用生成的JWT

	resp, err := hClient.Do(req)
	assert.NoError(t, err)
	defer func(Body io.ReadCloser) {
		err := Body.Close()
		if err != nil {
			log.Println("Error closing response body:", err)
		}
	}(resp.Body)

	body, err := io.ReadAll(resp.Body)
	assert.NoError(t, err)

	assert.Equal(t, http.StatusOK, resp.StatusCode, string(body))
	log.Printf("[http] CreateUser %+v\n", resp)
}

func TestUpdateUserHTTP(t *testing.T) {
	hClient := setupHTTPClient()
	reqBody, err := json.Marshal(map[string]string{
		"mobile":   "138110110",
		"password": "newpassword",
		"nickName": "newnickname",
		"gender":   "female",
		"role":     "2",
	})
	assert.NoError(t, err)

	token, err := generateJWT()
	assert.NoError(t, err)

	req, err := http.NewRequest("PUT", "http://127.0.0.1:8002/v1/users/2", bytes.NewBuffer(reqBody))
	assert.NoError(t, err)
	req.Header.Set("Content-Type", "application/json")
	req.Header.Set("Authorization", "Bearer "+token) // 使用生成的JWT

	resp, err := hClient.Do(req)
	assert.NoError(t, err)
	defer func(Body io.ReadCloser) {
		err := Body.Close()
		if err != nil {
			log.Println("Error closing response body:", err)
		}
	}(resp.Body)

	body, err := io.ReadAll(resp.Body)
	assert.NoError(t, err)

	assert.Equal(t, http.StatusOK, resp.StatusCode, string(body))
	log.Printf("[http] UpdateUser %+v\n", resp)
}

标签:kratos,log,err,resp,assert,NoError,Go,http,商城
From: https://blog.csdn.net/m0_73516381/article/details/140782286

相关文章

  • Django-APP及项目入门
    1.APP定义:Django中功能的细分,每个APP有独立的数据库、表结构、HTML模版、CSS。创建APPpythonmanage.pystartappapp01重要文件介绍views.py:常用文件,urls中的函数常常在此处定义。models.py:常用文件,对数据库进行操作。2.项目入门确保app也注册(settings.py)......
  • Django安装、项目创建及默认文件介绍
    1.安装pipinstalldjango【注】:Django安装完后,存放于Lib下的site-packages中。2.创建项目终端创建"D:\Python\Python312\Scripts\django-admin.exe"startprojectmysite2django-admin.exestartprojectmysite2#Scripts已加入环境变量可以直接使用django-admin.exe进......
  • 02 Go语言开发REST API接口_20240728 课程笔记
    概述如果您没有Golang的基础,应该学习如下前置课程。Golang零基础入门Golang面向对象编程GoWeb基础基础不好的同学每节课的代码最好配合视频进行阅读和学习,如果基础比较扎实,则阅读本教程巩固一下相关知识点即可,遇到不会的知识点再看视频。视频课程最近发现越来越多的......
  • 【Golang 面试 - 进阶题】每日 3 题(三)
    ✍个人博客:Pandaconda-CSDN博客......
  • 【Golang 面试 - 进阶题】每日 3 题(四)
     ✍个人博客:Pandaconda-CSDN博客......
  • Django数据导入导出神器django-import-export使用
    前言Django以快速开发闻名,但是如果处理数据的导出导入还需要自己写脚本,那就有违“Python之禅”了……而且导数据通常需要不同的格式,Excel、csv、json等,每种格式的数据就要写一个脚本太麻烦了,这时直接祭出django-import-export这个神器,官方一句话介绍:django-import-exportisaD......
  • 用依赖倒置和控制反转,突破Golang循环调用限制之后的思考
    在软件开发中,随着项目规模的扩大和业务逻辑的复杂化,重构代码变得越来越重要。本文将介绍如何在既有代码基础上,通过依赖倒置(DIP)和控制反转(IoC),实现新增加的代码可以循环引用到服务层的代码。然后,我们将探讨接口隔离、设计小而清晰的接口和包,以及共同依赖原则等内容。包引用时的......
  • 验证码原理与Django实现--简单图片验证码
    前言在网页中常见图片中包含数字字母的验证码如下如果将其简化,那么我们可以认为验证码是由数字字母加上遮挡的线段所构成。本文,我们不妨先解决其中数字与字母的简单生成数字字母的生成原理与代码实现 首先,可以使用PIL库中的类Image和ImageDraw,用于生成图片和调用画笔对生......
  • Springboot 解决mongodb transaction WriteConflict问题
     参考原文:  https://segmentfault.com/a/1190000040457995?sort=newest问题:  使用Mongodb的事务:pringframework.data.mongodb.UncategorizedMongoDbException:Commandfailedwitherror112(WriteConflict):'WriteConflict'WriteConflicterror:thisoperationco......
  • Montgomery 模乘
    Montgomery模乘将数字变换到Montgomery数域,使得在Montgomery数域计算\(ab\bmodN\)是容易的,最后从Montgomery数域将数字变换回来。由于需要两次变换,Montgomery乘法比Barrett乘法慢一点;但如果需要大量计算,由于中间过程可以全部在Montgomery数域完成,Montgomery乘法......