Nội dung bài viết
I. Mở đầu
Hồi đầu mới học về selenium thì mình coi thường phần Log lắm vì nghĩ là nếu mà test chạy sai thì mình chỉ cần run Debug là sẽ tìm được nguyên nhân nhưng lúc làm thì không đơn giản như vậy. Có những lúc test fail mà mình cứ debug run từng chỗ thì test lại pass, sau đó run bình thường thì lại fail, bực chỉ muốn đập ***ẹ máy.
Lúc đó mình mới dùng cách thủ công là show mọi thứ ra console, nhưng đúng là system.out.println thì còn xơi mới bằng được Log chuyên nghiệp. Trong java, Log4j là một cái tên nổi tiếng, nó được sử dụng cho đủ loại project chứ ko phải chỉ sử dụng trong test. Log4j support nhiều kiểu config khác nhau chứ không chỉ 1 cách sử dụng mà mình viết ở dưới nhé, cách mình làm chỉ là cách mà mình thấy dễ dàng thôi. Và để tránh ảo tưởng thì bài viết nay chỉ cung cấp 1 phần rất nhỏ kiến thức về Log4j, các bạn muốn học tường tận thì tự nghiên cứu, mình cũng không biết nhiều lắm đâu.
II. Cài đặt thư viện vào trong project
1. Download Log4j
tại: https://logging.apache.org/log4j/2.0/download.html
2. Add thư viện vào project:
Lưu ý chỉ chọn 2 thứ là: log4j-api-2.11.1.jar và log4j-core-2.11.1.jar, những file jar còn lại ko cần thiết.
Note: Nếu bạn nào sử dụng maven project thì có thế add vào file pom.xml
<dependency> <groupid>org.apache.logging.log4j</groupid> <artifactid>log4j-core</artifactid> <version>2.11.1</version> </dependency> <dependency> <groupid>org.apache.logging.log4j</groupid> <artifactid>log4j-api</artifactid> <version>2.11.1</version> </dependency>
III. Config log và cách sử dụng Log
1. Cách config log
Config log ở đây gồm mấy thứ:
- Chọn loại output: File hay Console
- Cách Log được hiển thị.
- Chọn level Log
Những config này sẽ được nằm ở trong 1 file log4j2.xml, file này được nằm trong 1 folder thuộc project và phải thông báo cho project biết vị trí của file config. Hãy làm theo hướng dẫn hình ảnh dưới đây:
2. File log4j2.xml có nội dung như sau:
<!--?xml version="1.0" encoding="UTF-8"?--> <configuration> <properties> <property name="basePath">./logs</property> </properties> <appenders> <rollingfile name="File" filepattern="${basePath}/app-%d{yyyy-MM-dd}.log"> <patternlayout pattern="%d{HH:mm:ss.SSS} %-5level %c{2} %msg%n"> <policies> <timebasedtriggeringpolicy interval="1" modulate="true"> </timebasedtriggeringpolicy></policies> </patternlayout></rollingfile> <console name="Console"> <patternlayout pattern="%d{HH:mm:ss.SSS} %-5level %c{1} %msg%n"> </patternlayout></console> </appenders> <loggers> <root level="info"> <appenderref ref="File"> </appenderref></root> </loggers> </configuration>
Trong đó:
<Property name="basePath">./logs</Property
là để xác định vị trí mà File log sẽ được lưu lại. Bạn cần tạo folder logs trước.
filePattern="${basePath}/app-%d{yyyy-MM-dd}.log"
để file Log sẽ có tên chứa ngày tháng năm.
PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %c{2} %msg%n"
để dòng Log sẽ hiển thị có chứa các thông tin về thời gian, tên của Class được log và message mà mình tạo. Khi run test xong, bạn sẽ được nhìn rõ hơn thông tin đó.
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
để config rằng mỗi 1 ngày run test bao nhiêu lần thì cũng chỉ tạo ra 1 file log duy nhất và các dòng log sẽ được in ra tuần tự, nếu bạn nào muốn config kích thước của mỗi file thì các bạn tự tìm hiểu.
<AppenderRef ref="File"/>
để chọn output log là File. Nếu bạn muốn output Log ra Console thì thay “File” –> “Console”
3. Cách sử dụng Log trong Test:
Bạn có thể đặt log vào bất kỳ method nào mà không ảnh hưởng đến quá trình run test. Ví dụ trong TH này, mình đặt Log vào 2 chỗ:
- Method Test
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; public class LoginTest extends BaseTest { private static final Logger log = LogManager.getLogger(LoginTest.class.getName()); @Test(dataProvider="loginData") public void loginFail(String userName, String password) { log.info("**********Test_login_fail_with_data_from_excel***********"); loginPg = new LoginPage(driver); loginPg.login(userName, password); Assert.assertTrue(loginPg.isDisplayed()); } }
- Method được Test gọi đến
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; public class LoginPage { private static final Logger log = LogManager.getLogger(LoginPage.class.getName()); public void login(String userName, String password) { user_login.sendKeys(userName); user_pass.sendKeys(password); submitBtn.click(); log.info("Login with username: '"+ userName + "' and password: '" + password + "'"); } }
Sau khi run, kết quả sẽ trả ra như sau:
Dựa vào đây các bạn sẽ thấy được rất rõ ràng code mình chạy qua những bước nào, tất nhiên là tùy vào mức độ cụ thể mà bạn muốn log, muốn chi tiết thì phải log nhiều thông tin hơn.
IV. Tổng kết
Như đã nói ở trên Log4j là 1 sản phẩm lớn, nếu muốn hiểu kỹ, hiểu sâu về nó thì bạn nên đầu tư thời gian để học và thực hành nhiều hơn nữa. Chúc các bạn tự tin hơn với kỹ năng debug bằng cách sử dụng Log.
[…] ← Previous Next → […]
Em cũng đã không dùng log4j cho đến 1 ngày phát hiện ra nó thật là powerful. Tuy nhiên, em nghĩ có 1 cách log hiệu quả đó là viết các hàm wrapper cho common method như là sendkeys, clickOnLocator, etc. Thêm nữa là viết hàm log tên của method ở beforeMethod và tất nhiên cần phải đặt tên method sao cho cái tên thể hiện mục đích của test case . Như vậy, test code sẽ ko cần lo việc viết hàm log gì nữa cả 😀
Hi em, cách của em cũng là 1 cách rất tốt khi tự build fw cho riêng mình. Đó cũng là cách mà nhiều người đã làm. Anh hiện tại đã không quan tâm đến việc đặt log ở đâu vì anh sử dụng serenity BDD framework cho UI automation test. FW này đã hỗ trợ anh làm gần hết các việc, anh chỉ còn phải tập trung viết test nữa thôi.
Anh ơi khi mình xuất log ra file và console. Vậy làm thế nào để mình dùng TestNG để verify nội dung trong file log vậy anh.
Em cảm ơn!
Mình ko test cái log em ạ, nó giống như em viết test để kiểm tra việc mình viết test đã đúng hay chưa.
Anh ơi, em đang chạy shell script linux ssh bằng java . khi chạy xuất thông tin ra file log và console em muốn assert cái content trong log để biết được là shell script pass hay fail.. có cách nào không anh! em cảm ơn!
Em nên lấy test report để biết pass hay fail. Log để tìm nguyên nhân gây ra exception, ko dùng để kiểm tra cái shell script của em pass hay fail.
Mà giả sử mình muốn lấy nội dung trong log xuất ra để verify với nội dung thực tế có được không anh. hay mình làm sao ạ!
Thực tế anh ko hiểu em muốn gì và vì sao em cần phải làm thế. Anh đã trả lời với em lần trước là log ko phải là cái để em coi là test report. Nếu em vẫn khăng khăng muốn so sánh log, thì việc đọc file rồi so sánh content cũng ko phải việc gì khó khăn. Em tự google tiếp.