美文网首页
golang性能测试框架k6源码分析

golang性能测试框架k6源码分析

作者: heliping_peter | 来源:发表于2021-10-19 10:22 被阅读0次

    k6是新兴的性能测试框架,比肩jmeter,另外测试脚本使用js,更加适合自动化的架构。
    k6启动的框架是使用golang的cli标准框架cobra,入口函数

    func main() {
        cmd.Execute()
    }
    

    进入cobra框架后,我们直接查看getRunCmd,这个是命令run的入口,主要工作都是从这里开始。

    func getRunCmd(ctx context.Context, logger *logrus.Logger) *cobra.Command {
    ...........
    initRunner, err := newRunner(logger, src, runType, filesystems, runtimeOptions, builtinMetrics, registry)
    

    重点关注初始化Runner,这个是通过js脚本,使用goja库解析后,生成的实际执行单元。
    进入js目录,查看Runner的结构,runner.go

    type Runner struct {
        Bundle         *Bundle
        Logger         *logrus.Logger
        defaultGroup   *lib.Group
        builtinMetrics *metrics.BuiltinMetrics
        registry       *metrics.Registry
    
        BaseDialer net.Dialer
        Resolver   netext.Resolver
        // TODO: Remove ActualResolver, it's a hack to simplify mocking in tests.
        ActualResolver netext.MultiResolver
        RPSLimit       *rate.Limiter
    
        console   *console
        setupData []byte
    }
    

    Runner有一些配置属性,另外还有方法,方法用lib.Runner的接口进行规范。
    Runner有一个NewVU方法,里面定义了连接参数,实现api测试

    func (r *Runner) newVU(idLocal, idGlobal uint64, samplesOut chan<- stats.SampleContainer) (*VU, error) {
        // Instantiate a new bundle, make a VU out of it.
    .........
    dialer := &netext.Dialer{
            Dialer:           r.BaseDialer,
            Resolver:         r.Resolver,
            Blacklist:        r.Bundle.Options.BlacklistIPs,
            BlockedHostnames: r.Bundle.Options.BlockedHostnames.Trie,
            Hosts:            r.Bundle.Options.Hosts,
        }
    

    返回主函数,在初始化完成Runner后,启动调度器,以及做结果收集
    最终封装成一个engine

    // Create the engine.
                initBar.Modify(pb.WithConstProgress(0, "Init engine"))
                engine, err := core.NewEngine(execScheduler, conf.Options, runtimeOptions, outputs, logger, builtinMetrics)
                if err != nil {
                    return err
                }
    
                // Spin up the REST API server, if not disabled.
    

    启动测试

    // Start the test run
                initBar.Modify(pb.WithConstProgress(0, "Starting test..."))
                if err := engineRun(); err != nil {
                    return errext.WithExitCodeIfNone(err, exitcodes.GenericEngine)
                }
                runCancel()
    

    相关文章

      网友评论

          本文标题:golang性能测试框架k6源码分析

          本文链接:https://www.haomeiwen.com/subject/ynzooltx.html