美文网首页性能测试
性能测试工具Locust使用指南(二)

性能测试工具Locust使用指南(二)

作者: yytester | 来源:发表于2017-11-27 17:00 被阅读37次

    上一篇文章性能测试工具Locust使用指南(一)主要介绍了Locust的基本概念,主要功能和一个示例,这篇主要讲进阶的功能.

    • Locust类


    一个locustfile至少包含一个继承了Locust的类.Locust会为被模拟的每个用户生成locust的实例,这些属性是应该被实现的:

    • task_set
      task_set属性应该指向一个TaskSet类, 这个属性定义了用户的一些行为,例如执行任务的间隔时间min_waitmax_wait.(如果不定义,则默认1s)

    • weight
      可以在一个文件里执行两个locusts:
      locust -f locust_file.py WebUserLocust MobileUserLocust
      如果希望让其中一个locust执行得更多,那么以在这些类上设置一个权重属性weight 。比如说,WebUserLocust比MobileUserLocust多三倍:

      class WebUserLocust(Locust):
          weight = 3
          ....
      
      class MobileUserLocust(Locust):
          weight = 1
          ....
      
    • host
      如果在locust类中声明了一个host属性,那么在命令行中没有指定主机时将使用它。

    • TaskSet类


    每个Locust类必须有一个task_set属性,task_set指向一个TaskSet类。TaskSet相当于Locust的大脑.
    任务设置任务的典型方法是使用任务修饰器:

    from locust import Locust, TaskSet, task
    
    class MyTaskSet(TaskSet):
        @task
        def my_task(self):
            print("Locust instance (%r) executing my_task" % (self.locust))
    
    class MyLocust(Locust):
        task_set = MyTaskSet
    

    taskset的一个非常重要的特性是它们可以被嵌套,因为真正的网站通常是以分层的方式构建的,有多个子节。嵌套taskset将允许我们定义一个行为,以更现实的方式模拟用户。例如,可以用以下结构定义taskset:

    class ForumPage(TaskSet):
      @task(20)
      def read_thread(self):
          pass
    
      @task(1)
      def new_thread(self):
          pass
    
      @task(5)
      def stop(self):
          self.interrupt()
    
    class UserBehaviour(TaskSet):
      tasks = {ForumPage:10}
    
      @task
      def index(self):
          pass
    

    在上面的例子中,如果ForumPage在执行UserBehaviour任务集时被选择执行,那么ForumPage任务集就会开始执行。ForumPage任务集将选择它自己的任务之一执行它.

    有一个重要的事情需要注意,那就是在ForumPage的stop方法中调用self.interrupt()。这实际上是停止执行ForumPage任务集,但UserBehaviour实例将会继续运行。如果没有调用ForumPage的中断()方法,那么Locust一旦启动就不会停止运行该ForumPage任务。通过使用中断函数,我们可以结合任务权重定义一个模拟用户离开测试网站的可能。

    还可以使用@ task decorator声明嵌套的TaskSet,就像声明普通任务时一样:

    class MyTaskSet(TaskSet):
      @task
      class SubTaskSet(TaskSet):
          @task
          def my_task(self):
              pass
    
    • 使用Http请求

      • 到目前为止,只讨论了Locust用户的任务调度部分。为了实际加载测试系统,我们需要发出HTTP请求。为了做到这一点,需要使用HttpLocust类。当使用这个类时,每个实例都会得到一个客户端属性,它将是HttpSession的一个实例,可用于发出HTTP请求。
        在Locust实例化后创建的HttpSession实例。客户端支持cookie,因此可以在HTTP请求之间保持会话。

      • URL里有动态参数的话,可以通过将名称参数传递给HttpSession的不同请求方法来完成。

        #Statistics for these requests will be grouped under: /blog/?id=[id]
        for i in range(10):
            client.get("/blog?id=%i" % i, name="/blog?id=[id]")
        
      • 对共享公共库的多个locustfile进行分组。在这种情况下,重要的是将project root定义为调用locust的目录,并且建议所有的locustfiles都在project root下的某个地方。
        子目录定义方法参见下面的例子,但是locust只会导入于运行的locustfile所处的那个目录的模块。如果是希望从project root(即运行locust命令的位置)导入,请确保在导入任何公共库之前,在locust文件中加入sys.path.append(os.getcwd()),这将使project root(即当前工作目录)是可导入的。

      • project root

        • init.py
        • common/
          • init.py
          • config.py
          • auth.py
        • locustfiles/
          • init.py
          • web_app.py
          • api.py
          • ecommerce.py

        使用上述项目结构,你的本地化文件可以使用以下方法导入公共库:

        sys.path.append(os.getcwd())
        import common.auth
        

    相关文章

      网友评论

        本文标题:性能测试工具Locust使用指南(二)

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