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()
网友评论