2013-03-22 17 views
11

Tôi đang cố gắng mô đun hóa một loạt các thử nghiệm hiệu suất trong Gatling.Các kịch bản mô phỏng để chạy theo trình tự bằng cách sử dụng Gatling

Một số thử nghiệm thực thi cùng một đường dẫn ban đầu thông qua các trang, vì vậy tôi nghĩ rằng tôi có thể chia nhỏ chúng thành một loạt các kịch bản, mỗi kịch bản là một loạt các hành động được chia sẻ được xác định trong tệp riêng của nó. Định nghĩa mô phỏng chỉ đơn giản là thực thi các kịch bản được chỉ định sau cái khác.

Điều tôi cần là để Mô phỏng chạy các kịch bản đó theo thứ tự; nhưng tôi chỉ có thể tìm cách chạy chúng đồng thời, hoặc với độ trễ được chỉ định giữa mỗi lần. Có tùy chọn Thiết lập mô phỏng nào để chạy các kịch bản được xác định sau cái khác mà không xác định độ trễ tùy ý không?

EDIT

Hiện nay, tôi đã sau đây tập hợp các tập tin:

homepageHeaders.scala

package advanced 

object homepageHeaders { 

    val homepage_headers_1 = Map(
     "Accept" -> """text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8""", 
     "If-Modified-Since" -> """Wed, 20 Mar 2013 15:36:31 +0000""", 
     "If-None-Match" -> """"1363793791"""" 
    ) 

} 

homepageChain.scala

package advanced 
import com.excilys.ebi.gatling.core.Predef._ 
import com.excilys.ebi.gatling.http.Predef._ 
import com.excilys.ebi.gatling.jdbc.Predef._ 
import akka.util.duration._ 
import homepageHeaders._ 


object homepageChain { 

    val homepageChain = 
     //Homepage 
     exec(http("homepage") 
        .get("/") 
        .headers(homepageHeaders.homepage_headers_1) 
      ) 

} 

pageHeaders.scala

012.351.
package advanced 

object pageHeaders { 

    val page_headers_1 = Map(
      "Accept" -> """text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8""" 
    ) 

} 

pageChain.scala

package advanced 
import com.excilys.ebi.gatling.core.Predef._ 
import com.excilys.ebi.gatling.http.Predef._ 
import com.excilys.ebi.gatling.jdbc.Predef._ 
import akka.util.duration._ 
import pageHeaders._ 


object pageChain { 

    val pageChain = 
     //Page Menu 
     exec(http("page request") 
        .get("/page1") 
        .headers(pageHeaders.page_headers_1) 
      ) 

} 

pageSimulation.scala

package advanced 
import com.excilys.ebi.gatling.core.Predef._ 
import com.excilys.ebi.gatling.http.Predef._ 
import com.excilys.ebi.gatling.jdbc.Predef._ 
import homepageChain._ 
import pageChain._ 

class pageSimulation extends Simulation { 

    val urlBase = "http://www.mytestsite.com" 

    val httpConf = httpConfig 
      .baseURL(urlBase) 
      .acceptHeader("image/png,image/*;q=0.8,*/*;q=0.5") 
      .acceptEncodingHeader("gzip, deflate") 
      .acceptLanguageHeader("en-gb,en;q=0.5") 
      .userAgentHeader("Mozilla/5.0 (Windows NT 6.1; WOW64; rv:17.0) Gecko/20100101 Firefox/17.0") 

    val pageScenario = scenario("Bodycare Scenario") 
     .exec(homepageChain.homepageChain) 
     .exec(pageChain.pageChain) 


    setUp(
      homepageScenario.users(1).protocolConfig(httpConf) 
     ) 
} 

Các lỗi mà tôi nhận được là:

14:40:50.800 [ERROR] c.e.e.g.a.ZincCompiler$ - /Gatling/user-files/simulations/advanced/pageChain.scala:13: not found: value exec 
14:40:50.807 [ERROR] c.e.e.g.a.ZincCompiler$ -   exec(http("page request") 
14:40:50.808 [ERROR] c.e.e.g.a.ZincCompiler$ -  ^
14:40:53.988 [ERROR] c.e.e.g.a.ZincCompiler$ - /Gatling/user-files/simulations/advanced/homepageChain.scala:13: not found: value exec 
14:40:53.989 [ERROR] c.e.e.g.a.ZincCompiler$ -   exec(http("homepage") 
14:40:53.989 [ERROR] c.e.e.g.a.ZincCompiler$ -  ^
14:41:17.274 [ERROR] c.e.e.g.a.ZincCompiler$ - two errors found 
Exception in thread "main" Compilation failed 

Rõ ràng tôi là thiếu một cái gì đó trong tôi định nghĩa, nhưng tôi chỉ không hiểu nó là gì

Trả lời

17

Bạn có thể soạn chuỗi chứ không phải kịch bản.

Ví dụ:

val login = exec(...)... 
val foo = exec(...)... 
val bar = exec(...)... 
val scn1 = scenario("Scenario1").exec(login).exec(foo) 
val scn2 = scenario("Scenario2").exec(login).exec(bar) 

rõ ràng?

+0

tôi có thể thấy các nguyên tắc chung, nhưng đang gặp khó khăn để thực hiện nó trong thực tế - tôi thiếu java/scala là thực sự bắt đầu để đạt nhà –

+0

Tại thời điểm này, đó là nhiều hơn một vấn đề Gatling DSL (docu, có thể) hơn một Scala một. Dưới đây là ví dụ: https://github.com/excilys/gatling-hands-on/blob/master/gatling-hands-on-demo/src/test/scala/computerdatabase/Step10.scala –

+0

Về chỉnh sửa của bạn: bạn đang thiếu một số hàng nhập khẩu (chúng đã ở đây chắc chắn nếu bạn đã sử dụng Máy ghi âm). Ở đây, một trong những thiếu cho biên dịch là bootstrap, nhưng bạn sẽ đánh những người khác sớm hay muộn. Vui lòng xem mẫu tôi đã cung cấp và thêm tất cả chúng. –

3

Nhờ Stephane, anh ấy cũng đã cho tôi một giải pháp để tạo ra một đối tượng của nhiều chuỗi và chuyển nó cho kịch bản.

val login = exec(...)... 
    val foo = exec(...)... 
    val bar = exec(...)... 
    val scn_inpute = Seq(login, foo, bar) 
    val scn1 = scenario("Scenario1").exec(scn_inpute) 
10

Bạn có thể thác kịch bản để họ thực hiện theo thứ tự như sau:

val allScenarios = scenario1.exec(scenario2).exec(scenario3) 
+0

Oh god bless bạn, không chắc chắn tại sao tôi đã không tìm thấy điều này trong tài liệu. – cvakiitho

+0

Tôi đang cố gắng tìm ra cách sử dụng hàng nhập khẩu để tổ chức dự án gatling của tôi. Giải pháp ở đây dường như bị mất khi liên kết github bị hỏng. Bất kỳ cái nhìn sâu sắc hơn? Câu hỏi của tôi là ở đây: http://stackoverflow.com/questions/34540818/how-can-i-use-gatling-code-from-another-simulation – digidigo

1

Một lựa chọn khác có thể như thế này:

object GetAllRunDetails { 
    val getAllRunDetails = exec(....) 
} 


object GetRunIdDetails{ 
    val getRunIdDetails = exec(....) 
} 

val scn1 = scenario("Scenario 1") 
    .exec(GetAllRunDetails.getAllRunDetails) 

val scn2 = scenario("Scenario 2") 
    .exec(GetRunIdDetails.getRunIdDetails) 


setUp(scn1.inject(atOnceUsers(1)), 
     scn2.inject(atOnceUsers(1))); 
+0

@PiotrBoho Không có cách nào. Tôi sử dụng nó hàng ngày và nó hoạt động tốt. Kiểm tra tài liệu chính thức của họ. –

+0

@PiotrBoho Nhìn vào đây: http://gatling.io/docs/current/advanced_tutorial/ –

+0

Ok nó sẽ biên dịch. Chỉ cần sửa đổi bạn trả lời làm hiển thị tất cả các mã này là trong một lớp kế thừa từ mô phỏng nếu không exec() sẽ không biên dịch. BTW câu hỏi là về modularising vì vậy GetAllRunDetails và GetRunIdDetails nên được định nghĩa trong các tệp riêng biệt và sau đó bạn cần hiển thị nơi exec() đến từ đó. –