从属性文件中读取配置
本章是关于如何在Selenium Cucumber Framework 或任何框架中从属性文件中读取配置的。在项目中存储硬编码值是危险的,也违反了编码原则。到目前为止,我们在代码中使用了大量的硬编码值。在属性文件的帮助下,我们将逐一消除这些硬编码值。
什么是Java中的Property文件
.properties 文件主要用于Java程序,以维护项目配置数据,数据库配置或项目设置等。属性文件中的每个参数都以键值对格式存储为一对字符串,其中每个键都在一行上。您可以使用 Properties类型的对象轻松地从某个文件中读取属性。这是Java本身提供的实用程序。
java.util.Properties;
Java中Property文件的优点
如果从属性文件更改了任何信息,则无需重新编译java类。换句话说,使用属性文件的优点是我们可以配置在一段时间内易于更改的内容,而无需更改代码中的任何内容。
对于Eg。我们将应用程序Url保存在属性文件中,因此如果您想在其他测试环境中运行测试,只需更改属性文件中的Url即可。您不需要再次构建整个项目。
如何从属性文件中读取配置
第1步:创建属性文件
1.创建一个新的文件夹并将它命名为CONFIGS,通过右键单击在根项目,并选择新建文件夹>>。我们将把所有配置文件保存在同一个文件夹中。
2. 右键单击上面创建的文件夹创建一个新文件 ,然后选择新建>>文件。
3)。我们唯一需要做的就是提供文件名并将扩展名作为.properties。在我们的例子中,我们将其命名为Configuation.properties。
第2步:在属性文件中写入硬编码值
如果我们看一下步骤 文件的第一个方法,我们会发现我们一直在使用两个硬编码值:
- Driver Path = System.setProperty(“webdriver.chrome.driver”,“ C:\\ ToolsQA \\ Libs \\ Drivers \\ chromedriver.exe ”);
- 隐式等待时间 = driver.manage()。timeouts()。implicitlyWait(10,TimeUnit.SECONDS);
和HomePage.java类中的URL
- URL = driver.get(“ http://www.shop.demoqa.com ”);
1)所以,让我们开始在Key Value Pair的Property文件中写下这些值。
注意:以上是我们将用于Cucumber测试的属性文件。请记住,始终忽略属性名称和属性值之间的空格。
第3步:创建配置文件读取器
1.创建一个新包,并将其命名为数据提供程序,通过右键点击上的src / test / java下,选择新建>>软件包。我们将把所有数据读取器文件保存在此包中。
2.创建一个新的类文件,并将它命名为ConfigFileReader, 通过右键单击在上面创建的包并选择新建>>类。
ConfigFileReader.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
package
dataProviders
;
import
java
.
io
.
BufferedReader
;
import
java
.
io
.
FileNotFoundException
;
import
java
.
io
.
FileReader
;
import
java
.
io
.
IOException
;
import
java
.
util
.
Properties
;
public
class
ConfigFileReader
{
private
Properties
properties
;
private
final
String
propertyFilePath
=
"configs//Configuration.properties"
;
public
ConfigFileReader
(
)
{
BufferedReader
reader
;
try
{
reader
=
new
BufferedReader
(
new
FileReader
(
propertyFilePath
)
)
;
properties
=
new
Properties
(
)
;
try
{
properties
.
load
(
reader
)
;
reader
.
close
(
)
;
}
catch
(
IOException
e
)
{
e
.
printStackTrace
(
)
;
}
}
catch
(
FileNotFoundException
e
)
{
e
.
printStackTrace
(
)
;
throw
new
RuntimeException
(
"Configuration.properties not found at "
+
propertyFilePath
)
;
}
}
public
String
getDriverPath
(
)
{
String
driverPath
=
properties
.
getProperty
(
"driverPath"
)
;
if
(
driverPath
!=
null
)
return
driverPath
;
else
throw
new
RuntimeException
(
"driverPath not specified in the Configuration.properties file."
)
;
}
public
long
getImplicitlyWait
(
)
{
String
implicitlyWait
=
properties
.
getProperty
(
"implicitlyWait"
)
;
if
(
implicitlyWait
!=
null
)
return
Long
.
parseLong
(
implicitlyWait
)
;
else
throw
new
RuntimeException
(
"implicitlyWait not specified in the Configuration.properties file."
)
;
}
public
String
getApplicationUrl
(
)
{
String
url
=
properties
.
getProperty
(
"url"
)
;
if
(
url
!=
null
)
return
url
;
else
throw
new
RuntimeException
(
"url not specified in the Configuration.properties file."
)
;
}
}
|
说明
如何加载属性文件
1
2
3
|
BufferedReader
reader
=
new
BufferedReader
(
new
FileReader
(
propertyFilePath
)
)
;
Properties
properties
=
new
Properties
(
)
;
properties
.
load
(
reader
)
;
|
- propertyFilePath:这只是一个String变量,它保存配置文件路径的信息。
- new FileReader(propertyFilePath):给定要读取的文件的名称,创建一个新的 FileReader。
- new BufferedReader(new FileReader(propertyFilePath)):从字符输入流中读取文本,缓冲字符,以便有效读取字符,数组和行。
- new Properties() :Properties类表示一组持久的属性。可以将属性保存到流中或从流中加载。属性列表中的每个键及其对应的值都是一个字符串。
- properties.load(reader) :以简单的面向行的格式从输入字符流中读取属性列表(键和元素对)。
ConfigFileReader方法
1
2
3
4
5
|
public
String
getDriverPath
(
)
{
String
driverPath
=
properties
.
getProperty
(
"driverPath"
)
;
if
(
driverPath
!=
null
)
return
driverPath
;
else
throw
new
RuntimeException
(
"driverPath not specified in the Configuration.properties file."
)
;
}
|
- properties.getProperty(“driverPath”):属性对象给我们一个。getProperty 方法,它将属性的Key作为参数,并从.properties文件返回匹配键的Value。
- 如果属性文件没有指定的键,则返回null。这就是为什么我们已经进行了空检查,并且在null的情况下,我们希望抛出异常以使用堆栈跟踪信息停止测试。
第4步:在Steps文件中使用ConfigFileReader对象
要在测试中使用ConfigFileReader对象,我们需要先创建一个类的对象。
ConfigFileReader configFileReader = new ConfigFileReader();
然后我们可以替换下面的语句
System 。setProperty (“webdriver.chrome.driver” ,“C:\\ ToolsQA \\ Libs \\ Drivers \\ chromedriver.exe” );
使用
System.setProperty(“webdriver.chrome.driver”,configFileReader.getDriverPath());
完整步骤文件现在将如下所示:
Steps.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
package
stepDefinitions
;
import
java
.
util
.
concurrent
.
TimeUnit
;
import
org
.
openqa
.
selenium
.
WebDriver
;
import
org
.
openqa
.
selenium
.
chrome
.
ChromeDriver
;
import
cucumber
.
api
.
java
.
en
.
Given
;
import
cucumber
.
api
.
java
.
en
.
When
;
import
dataProviders
.
ConfigFileReader
;
import
managers
.
PageObjectManager
;
import
pageObjects
.
CartPage
;
import
pageObjects
.
CheckoutPage
;
import
pageObjects
.
HomePage
;
import
pageObjects
.
ProductListingPage
;
public
class
Steps
{
WebDriver
driver
;
HomePage
homePage
;
ProductListingPage
productListingPage
;
CartPage
cartPage
;
CheckoutPage
checkoutPage
;
PageObjectManager
pageObjectManager
;
ConfigFileReader
configFileReader
;
@Given
(
"^user is on Home Page$"
)
public
void
user_is_on_Home_Page
(
)
{
configFileReader
=
new
ConfigFileReader
(
)
;
System
.
setProperty
(
"webdriver.chrome.driver"
,
configFileReader
.
getDriverPath
(
)
)
;
driver
=
new
ChromeDriver
(
)
;
driver
.
manage
(
)
.
window
(
)
.
maximize
(
)
;
driver
.
manage
(
)
.
timeouts
(
)
.
implicitlyWait
(
configFileReader
.
getImplicitlyWait
(
)
,
TimeUnit
.
SECONDS
)
;
pageObjectManager
=
new
PageObjectManager
(
driver
)
;
homePage
=
pageObjectManager
.
getHomePage
(
)
;
homePage
.
navigateTo_HomePage
(
)
;
}
@When
(
"^he search for \"([^\"]*)\"$"
)
public
void
he_search_for
(
String
product
)
{
homePage
.
perform_Search
(
product
)
;
}
@When
(
"^choose to buy the first item$"
)
public
void
choose_to_buy_the_first_item
(
)
{
productListingPage
=
pageObjectManager
.
getProductListingPage
(
)
;
productListingPage
.
select_Product
(
0
)
;
productListingPage
.
clickOn_AddToCart
(
)
;
}
@When
(
"^moves to checkout from mini cart$"
)
public
void
moves_to_checkout_from_mini_cart
(
)
{
cartPage
=
pageObjectManager
.
getCartPage
(
)
;
cartPage
.
clickOn_Cart
(
)
;
cartPage
.
clickOn_ContinueToCheckout
(
)
;
}
@When
(
"^enter personal details on checkout page$"
)
public
void
enter_personal_details_on_checkout_page
(
)
{
checkoutPage
=
pageObjectManager
.
getCheckoutPage
(
)
;
checkoutPage
.
fill_PersonalDetails
(
)
;
}
@When
(
"^select same delivery address$"
)
public
void
select_same_delivery_address
(
)
{
checkoutPage
.
check_ShipToDifferentAddress
(
false
)
;
}
@When
(
"^select payment method as \"([^\"]*)\" payment$"
)
public
void
select_payment_method_as_payment
(
String
arg1
)
{
checkoutPage
.
select_PaymentMethod
(
"CheckPayment"
)
;
}
@When
(
"^place the order$"
)
public
void
place_the_order
(
)
{
checkoutPage
.
check_TermsAndCondition
(
true
)
;
checkoutPage
.
clickOn_PlaceOrder
(
)
;
driver
.
quit
(
)
;
}
}
|
我们的主页对象类文件也将进行更改。
HomePage.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
package
pageObjects
;
import
org
.
openqa
.
selenium
.
WebDriver
;
import
org
.
openqa
.
selenium
.
support
.
PageFactory
;
import
dataProviders
.
ConfigFileReader
;
public
class
HomePage
{
WebDriver
driver
;
ConfigFileReader
configFileReader
;
public
HomePage
(
WebDriver
driver
)
{
this
.
driver
=
driver
;
PageFactory
.
initElements
(
driver
,
this
)
;
configFileReader
=
new
ConfigFileReader
(
)
;
}
public
void
perform_Search
(
String
search
)
{
driver
.
navigate
(
)
.
to
(
configFileReader
.
getApplicationUrl
(
)
+
"/?s="
+
search
+
"&post_type=product"
)
;
}
public
void
navigateTo_HomePage
(
)
{
driver
.
get
(
configFileReader
.
getApplicationUrl
(
)
)
;
}
}
|
注意:虽然在每个类中创建属性文件的对象是不好的做法。我们在Steps文件中创建了相同的对象,现在我们再次在HomePage类中创建。但是现在不用担心,我在下一章给你一些特别的东西。
运行黄瓜测试
以JUnit身份运行
现在我们都准备好进行Cucumber测试了。 右键点击 上 的TestRunner 类,然后单击 运行方式>> JUnit测试。 Cucumber 将以与在Selenium WebDriver中运行相同的方式运行脚本, 结果将显示 在JUnit 选项卡的左侧 项目浏览器窗口中 。
Project Explorer