[Bài 24] Sử dụng log4j để debug trong selenium webdriver

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

Chọn file binary nhé

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:

Choose folder chứa file log4j2.xml

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.

0 0 votes
Article Rating
Subscribe
Notify of
guest
9 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
trackback

[…] ← Previous Next → […]

Van Anh Hoang
Van Anh Hoang
4 years ago

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ả 😀

Khang
Khang
4 years ago

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!

Khang
Khang
4 years ago
Reply to  Giang Nguyen

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!

Khang
Khang
4 years ago

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 ạ!