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
Nội dung bài viết
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ể.
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 ạ
Đồng ý, nó nằm trong list các bài viết sắp tới.