Tự học Automation Testing Cơ Bản với Selenium - Tại sao không? (Phần II)

1. Java Cơ Bản (tiếp theo)

Mảng (Array)

Mảng là gì? Như chúng ta đã tìm hiểu ở bài trước về các Kiểu Dữ liệu khác nhau thì chúng ta có thể lưu trữ các giá trị trong các biến dựa theo kiểu dữ liệu như int i=5; double d = 12.254; v.v.... trong Java. Và nếu bạn muốn lưu trữ nhiều giá trị (như 10 hoặc 15 giá trị khác nhau chẳng hạn) trong các biến khác nhau thì bạn sẽ mất thời gian để khởi tạo nhiều biến khác nhau cho từng giá trị. Trong trường hợp này, bạn có thể dùng mảng để lưu trữ nhiều giá trị khác nhau trong mảng. Một mảng có thể lưu trữ nhiều giá trị thuộc cùng kiểu dữ liệu (như int, char, String) cùng lúc và mỗi khu vực dữ liệu được lưu trữ đều có một index duy nhất. Có 2 kiểu mảng trong Java đó là Mảng Một Chiều và Mảng Hai Chiều.

Mảng Một Chiều

Array Index 0 1 2 3 4 5
Array Value 10 12 48 17 5 49

Bảng trên mô tả mảng một chiều có một dòng dữ liệu. Mảng một chiều giống như một bảng tính có dữ liệu đi kèm trong một dòng. Như bạn đã thấy ở trên, Index của mảng bắt đầu từ số 0, nghĩa là giá trị 10 sẽ có Index 0, 12 có Index 1, v.v... và mỗi giá trị có thể được nhận dạng bằng Index của nó. Chúng ta có thể khởi tạo các giá trị trong mảng như trong ví dụ dưới đây.

public class Array_Example {

public static void main(String[] args) {
 int a[] = new int[6]; //Array declaration and Creation. 6 is length of array.
 a[0] = 10; //initialize 1st array element
 a[1] = 12; //initialize 2nd array element
 a[2] = 48; //initialize 3rd array element
 a[3] = 17; //initialize 4th array element
 a[4] = 5;  //initialize 5th array element
 a[5] = 49; //initialize 6th array element
 
 for(int i=0; i<a.length; i++){
 System.out.println(a[i]);
 }
}

}

Theo đó, chiều dài của mảng a[] là 6 và kiểu dữ liệu của mảng này là int, điều này có nghĩa là chúng ta có thể lưu trữ tối đa 6 giá trị số nguyên trong mảng này. Khi bạn chạy ví dụ trên trong Eclipse, kết quả sẽ trả về như sau.

a[0] Holds 10
a[1] Holds 12
a[2] Holds 48
a[3] Holds 17
a[4] Holds 5
a[5] Holds 49

Ngoài ra còn có cách khác để khởi tạo mảng một chiều tương tự như thế.

int a[] = {10,12,48,17,5,49};

Mảng Hai Chiều

Row-index
Array Value User1 Password1 0
Array Value User2 Password2 1
Array Value User3 Password3 2
Columm-Index 0 1

Mảng Hai Chiều trong Java giống như một bảng tính có nhiều dòng và cột có dữ liệu khác nhau ở từng ô. Mỗi ô sẽ được nhận dạng bằng cách nối Index giữa dòng và cột duy nhất (Ví dụ str[5][3]). Chúng ta có thể dùng Mảng Hai Chiều để lưu trữ id và mật khẩu người dùng của nhiều người dùng khác nhau như ở bảng trên. Theo đó, chúng ta có thể khởi tạo các giá trị trong Mảng Hai Chiều như sau.

public class Twodimarray {

 public static void main(String[] args) {
  String str[][] = new String[3][2]; //3 rows, 2 columns
  str[0][0]="User1";
  str[1][0]="User2";
  str[2][0]="User3";
  str[0][1]="Password1";
  str[1][1]="Password2";
  str[2][1]="Password3";
  
  for(int i=0; i<str.length; i++){//This for loop will be total executed 3 times.
   for(int j=0; j<str[i].length; j++){//This for loop will be executed for 2 time on every iteration.
    System.out.println(str[i][j]);
   }
  }
 }
}

Khi bạn chạy ví dụ này trong Eclipse, kết quả sau sẽ trả về.

User1
Password1
User2
Password2
User3
Password3

Ngoài ra có cách khác để khởi tạo Mảng Hai Chiều như sau.

String str[][] = {{"User1","Password1"},{"User2","Password2"},{"User3","Password3"}};

Các Phương Thức Trong JAVA

Phương thức là gì? Trong các test suite Selenium webdriver dành cho ứng dụng web phần mềm, bạn cần thực hiện một số hành động vài lần hoặc trong nhiều testcase chẳng hạn như Đăng nhập vào ứng dụng web, Place Order hay bất kỳ hành động nào khác trên ứng dụng phần mềm. Nếu bạn viết kiểu hành động này (lặp lại tương tự) trong tất cả các testcase thì sẽ lãng phí thời gian của bạn và sẽ làm tăng kích cỡ code. Thay vào đó, nếu bạn tạo ra các phương thức cho cùng loại các hành động này và sau đó gọi đến phương thức đó bất cứ khi nào cần thì sẽ dễ dàng hơn rất nhiều trong việc bảo trì các test case của ứng dụng phần mềm web đó. Phương thức là một nhóm các câu lệnh được khởi tạo để thực hiện một số hành động khi code java gọi đến nó từ phương thức chính. Code được viết trong các phương thức không thể được thực thi bởi chính nó. Để thực thi khối code của phương thức đó, bạn cần gọi đến phương thức đó bên trong khối phương thức chính. Dưới đây là ví dụ đơn giản về cách khởi tạo một phương thức và cách gọi đến nó từ khối phương thức chính.

public class Methodexample {

 public static void main(String[] args) {
  Test1(); //Test1() method called inside main method.
  
 }
 
 public static void Test1(){ //Simple Method - Called from main method.
  System.out.println("Test1 Method Executed.");
 }
 
 public static void Test2(){ //Simple Method - Not called from main method.
  System.out.println("Test2 Method Executed.");
 }

}

Nếu bạn chạy code ví dụ trên thì đầu ra sẽ như sau:

Test1 Method Executed.

Dựa trên đầu ra đó, ta có thể hiểu rằng phương thức Test1() được thực thi nhưng phương thức Test2() không được thực thi vì nó không được gọi từ phương thức chính. Các phương thức sẽ có các thành phần khác nhau dưới đây:

  1. Phạm vi của Phương thức: Bạn có thể thiết lập phạm vi của phương thức bằng cách cung cấp các từ khóa access modifier như public, private, protected ngay đầu phương thức. Chẳng hạn như:
public static void Testing_Nomod(){ //public method
  //Block of code
}
  1. Kiểu trả về của Phương thức: Bất cứ phương thức nàp cũng có các kiểu trả về như int, String, double, v.v... dựa trên kiểu dữ liệu của giá trị trả về. void nghĩa là phương thức đó không trả về bất kỳ giá trị nào. Chẳng hạn như:
public int Return_Type(){ //This method has int return type.
  int i=10;
  return i;
 }
  1. Phương thức Static hay non static: Phương thức có thể dạng static hoặc non static. Nếu bạn muốn phương thức của mình dưới dạng static thì bạn chỉ cần dùng từ khóa static đi kèm với phương thức. Nếu bạn muốn khởi tạo phương thức non static thì không cần viết từ khóa static kèm theo phương thức đó. Chẳng hạn như:
public void My_Method1(){ //Non static Method
  //Block of code
 }
 
public static void My_Method2(){ //Static Method
  //Block of code
 }
  1. Tên Phương thức: Bạn có thể đặt bất kỳ tên gì cho phương thức của mình. Hãy luôn sử dụng tên phương thức sao cho liên quan đến chức năng hoạt động của nó. Chẳng hạn như:
public static void Login(String user, String Pass){ //Login is the method name.
  //Block of code
 }
  1. Các tham số đầu vào gắn với Phương thức: Ta có thể gắn các tham số đầu vào cho bất kỳ phương thức nào. Nhớ là cần viết tham số đi cùng với kiểu dữ liệu của nó. Chẳng hạn như:
public static void Student_Details(int Rollno, String Name){ //Rollno and Name are input parameters preceded by their data types
  //Block of code
 }

Access Modifier trong Java

Access modifier là các từ khóa trong Java mà chúng ta có thể dùng để thiết lập mức độ truy cập cho class, các phương thức, các biến và các constructor. Có 4 loại access modifier được cung cấp trong Java.

  • public: Chúng ta có thể truy cập các phương thức hay các biến public từ tất cả class thuộc cùng package hay package khác.
  • private: Các phương thức và biến private có thể được truy cập chỉ từ cùng một class. Chúng ta không thể truy cập nó từ các class hay các class con khác thậm chí trong cùng package.
  • protected: Các phương thức protected có thể được truy cập từ các class thuộc cùng package hay các class con của class đó.
  • No Access Modifier: Nếu phương thức không có bất kỳ access modifier nào thì chúng ta có thể truy cập nó bên trong tất cả class thuộc cùng một package duy nhất.

Dưới đây là các ví dụ về sự khác nhau trên thực tế giữa 4 loại access modifier trong Java.

package Test_Package1;

public class Accessmodif {

 public static int i=10;
 private static String str="Hello";
 protected static double d=30.235;
 static char c='g';
 
 public static void main(String[] args) {
  Testing_pub();
  Testing_pri();
  Testing_pro();
  Testing_Nomod();
 }
 
 //Method with public access modifier. Can be accessible by any class.
 public static void Testing_pub(){
  System.out.println("Testing_pub() Executed");
  System.out.println("Value Of i Is "+i);
  System.out.println("Value Of str Is "+str);
  System.out.println("Value Of d Is "+d);
  System.out.println("Value Of c Is "+c);
 }
 
 //Method with private access modifier. Can be accessible from same class only.
 private static void Testing_pri(){
  System.out.println("Testing_pri() Executed"); 
 }
 
 //Method with protected access modifier. Can be accessible from any class of same package or sub class of this class.
 protected static void Testing_pro(){
  System.out.println("Testing_pro() Executed");
 }
 
 //Method with no access modifier. Can be accessible by all classes of same package Only.
 static void Testing_Nomod(){
  System.out.println("Testing_Nomod() Executed");
 }
}

package Test_Package1;

public class Access {

 public static void main(String[] args) {
  Accessmodif.Testing_pub(); //Can access public methods outside the class or package.
  //Accessmodif.Testing_pri(); - Can not access private methods outside the class
  Accessmodif.Testing_pro();  //Can access protected methods inside same package class.
  Accessmodif.Testing_Nomod(); //Can access no modifier methods inside same package class.  
 
  System.out.println();
  System.out.println("Value Of i Is "+Accessmodif.i); //Can access public variables outside the class or package.
  //System.out.println("Value Of str Is "+Accessmodif.str); - Can not access private variables outside the class
  System.out.println("Value Of d Is "+Accessmodif.d); //Can access protected variables inside same package class.
  System.out.println("Value Of c Is "+Accessmodif.c); //Can access no modifier variables inside same package class.
 }
}
package Test_Package2;

import Test_Package1.Accessmodif;

public class Accessing extends Accessmodif{

 public static void main(String[] args) {
  Testing_pub(); //Can access public methods outside the package.
  //Testing_pri(); - Can not access private methods outside the class. 
  Testing_pro(); //Can access protected methods inside child class.
  //Testing_Nomod(); - Can not access no access modifier methods outside the package.
  
  System.out.println();
  System.out.println("Value Of i Is "+i); //Can access public variables outside the package.
  //System.out.println("Value Of str Is "+str); - Can not access private variables outside the class.
  System.out.println("Value Of d Is "+d); //Can access protected variables inside child class.
  //System.out.println("Value Of c Is "+c); - Can not access no access modifier variables outside the package.
 }
}

Theo ví dụ ở trên, rõ ràng là dựa vào các access modifier, chúng ta có thể truy cập các biến, các phương thức, v.v... trong bất kỳ package hay class nào. Nếu bạn bỏ comment đi ở những phương thức hay các biến đã được comment từ các class trên, lỗi liên quan đến mức độ truy cập sẽ được bắn ra khi bạn chạy code.


THAM KHẢO:


All Rights Reserved