JMeter script 5: Cách đọc file text, json, csv

Một trong những task của các bạn hay gặp đó là đọc file data từ bên ngoài rồi, save thành biến để dùng các nơi trong jmeter. Hoặc đơn giản chỉ đọc nội dung file rồi verify gì đó.

Mình sẽ nói 3 TH cơ bản:

  • Đọc file text thông thường
  • Đọc file json
  • Đọc file csv

I. Đọc file text

Đọc file text thì cái bạn quan tâm thường là nội dung của file và thường áp dụng cho các file ko dài. Ví dụ file data1.txt có nội dung như sau:

418caaa5-e10a-498c-869f-5db766a91b17

Code để đọc file:

def baseDir = "C:/Users/dunguyen/Desktop/jmeter"

def data2 = new File(baseDir, 'data1.txt').getText()
log.info(data2)

II. Đọc file json

Thực ra thì đọc file json cũng y hệt như đọc file text, tuy nhiên mình cần convert text này thành object để có thể extract các value dễ hơn.

Giả sử mình có file data2.json như sau:

{
    "firstName": "John",
    "lastName": "doe",
    "age": 26,
    "address": {
        "streetAddress": "naist street",
        "city": "Nara",
        "postalCode": "630-0192"
    },
    "phoneNumbers": [
        {
            "type": "iPhone",
            "number": "0123-4567-8888"
        },
        {
            "type": "home",
            "number": "0123-4567-8910"
        }
    ]
}

Cách đọc file:

def baseDir = "C:/Users/dunguyen/Desktop/jmeter"
  
def data2 = new File(baseDir, 'data2.json').getText()
log.info(data2)

def slurper = new groovy.json.JsonSlurper()
def response = slurper.parseText(data2)
log.info("Full name is ${response.firstName} ${response.lastName} ")

III. Đọc file csv

Đặc điểm của file csv sẽ là mỗi dòng 1 dữ liệu khác nhau và mình quan tâm đến dòng (row) của file nên sẽ dùng method eachLine()

Mình có file data3.csv như sau:

name,age,address
lucas,10,HN
james,20,HCM
john,30,DN

Cách đọc file

def baseDir = "C:/Users/dunguyen/Desktop/jmeter"

new File(baseDir, 'data3.csv').eachLine {line, number ->
    log.info("Line $number: $line")
}
  • line là nội dung của dòng đó
  • number là số thứ tự của dòng
  • Nếu bạn muốn bỏ qua số dòng số bao nhiêu thì, bạn có thể làm như sau, ví dụ mình bỏ qua dòng đầu tiên.
def baseDir = "C:/Users/dunguyen/Desktop/jmeter"

new File(baseDir, 'data3.csv').eachLine {line, number ->
	if (number == 1) {return}
	
	log.info("Line $number: $line")
}
  • Nếu bạn muốn tách lấy từng value trong mỗi dòng thì bạn có thể save file csv này thành 1 List các Map. List<Map>
def baseDir = "C:/Users/dunguyen/Desktop/jmeter"

def content = []; (1)

new File(baseDir, 'data3.csv').eachLine {line, number ->
	if (number == 1) { return }
	
	def entry = [:] (2)
	def entries = line.split(',') (3)
	
	entry.put("name", entries[0]) (4)
	entry.put("age", entries[1])
	entry.put("address", entries[2])
	
	content.add(entry) (5)
}

def first_line = content[0] (6)
log.info("First line: name=${first_line.name}, age=${first_line.age}") (7)
  • (1): tạo ra 1 list rỗng dùng chung, nên cần viết bên ngoài.
  • (2): tạo ra 1 map rỗng cho mỗi dòng, nên sẽ viết bên trong.
  • (3): với mỗi dòng, mình sẽ split thành nhiều phần tử nhỏ hơn ở giữa dấu phảy ,
  • (4): sao đó, nhét từng phần tử vào trong map.
  • (5): add map vào bên trong list
  • (6) (7): lúc này tùy nhu cầu của bạn, bạn cần thông tin của dòng bao nhiêu, bạn có thể query từ trong list. Sau đó từ map, bạn query tiếp ra thông tin cụ thể.
0 0 votes
Article Rating
Subscribe
Notify of
guest
2 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Binh Trinh
Binh Trinh
2 months ago

Anh Giang bổ sung bài về cách lấy thông tin từ respone ra file txt hoặc csv đi ạ.
Cảm ơn anh nhiều ạ