ãã®ã¢ãããŒãã«é¢é£ããã®ã¯ãå®è¡ã¹ã¯ãªãããšåæ§æã®å®è£ ãåé¢ãããã¥ãŠãªããããããã¬ãŒã ã¯ãŒã¯ãåäœãªã©ã§ãããã®åé¢ã¯ãèªã¿åãå¯èœãªã¹ã¯ãªããã®äœæã«åœ¹ç«ã¡ãŸãããæéãããããããå®è£ ãäœæãããšãã«å®çšçã§ãªãå ŽåããããŸãã
é©åãªããŒã«ã䜿çšããŠãBDDã§ã®äœæ¥ãç°¡çŽ åããæ¹æ³ãèŠãŠã¿ãŸããããããšãã°ãBDDã®ååã®çŸãããå©äŸ¿æ§ãjUnitã®æ©èœãçµã¿åãããSpockãã¬ãŒã ã¯ãŒã¯ãªã©ã§ãã
ã¹ããã¯ãã¬ãŒã ã¯ãŒã¯
Spockã¯ãJavaããã³Groovyã¢ããªã±ãŒã·ã§ã³ã®ãã¹ãããã³ä»æ§ãã¬ãŒã ã¯ãŒã¯ã§ãã JUnitãã©ãããã©ãŒã ãããŒã¹ãšããŠäœ¿çšããããšã«ããããã®ãã¬ãŒã ã¯ãŒã¯ã¯ããã¹ãŠã®äžè¬çãªIDEïŒç¹ã«ãIntelliJ IDEAïŒãããŸããŸãªãã«ãããŒã«ïŒAntãGradleãMavenïŒãããã³ç¶ç¶ççµ±åïŒCIïŒãµãŒããŒãšäºææ§ããããŸãããã¬ãŒã ã¯ãŒã¯ã®éçºè ã®æžã蟌ã¿ãã¹ããã¯ã¯ãè§ŠçºãããŠã®JUnitãRSpecã®ãjMockãMockitoãGroovyã®ãã¹ã«ã©åº§ããŽã¡ã«ã«ã³ãšä»ã®é åçãªçåœäœãã
ãã®èšäºã§ã¯ãå©çšå¯èœãªææ°ããŒãžã§ã³ã§ããSpock Framework2.0ã«ã€ããŠèª¬æããŸãããã®æ©èœïŒJUnit5ãJava 8以éãgroovy 2.5ã䜿çšããæ©èœïŒããŒãžã§ã³3.0ã®ã¢ã»ã³ããªããããŸãïŒãSpockã¯Apache2.0ã§ã©ã€ã»ã³ã¹ãããŠãããå¿çæ§ã®é«ããŠãŒã¶ãŒã³ãã¥ããã£ããããŸãããã¬ãŒã ã¯ãŒã¯ã®éçºè ã¯ããã¹ãã®å®è¡ã埮調æŽã§ããå€ãã®æ¡åŒµæ©èœããã§ã«å«ãŸããŠããSpockã®æ¹è¯ãšéçºãç¶ããŠããŸããããšãã°ãçºè¡šãããæãè峿·±ãæ¹åé åã®1ã€ã¯ã䞊åãã¹ãå®è¡ã®è¿œå ã§ãã
Groovy
Groovyã¯ãPythonãRubyãããã³Smalltalkæ©èœãåããã¢ããªã³ãšããŠJavaãã©ãããã©ãŒã çšã«éçºããããªããžã§ã¯ãæåã®ããã°ã©ãã³ã°èšèªã§ããGroovyã¯ãJVMãã€ãã³ãŒããžã®åçã³ã³ãã€ã«ã䌎ãJavaã«äŒŒãæ§æã䜿çšããä»ã®Javaã³ãŒãããã³ã©ã€ãã©ãªãšçŽæ¥é£æºããŸãããã®èšèªã¯ãä»»æã®Javaãããžã§ã¯ãã§ããŸãã¯ã¹ã¯ãªããèšèªãšããŠäœ¿çšã§ããŸãã
groovyã®æ©èœã¯æ¬¡ã®ãšããã§ããéçåä»ããšåçåä»ãã®äž¡æ¹ããªã¹ããé åãããã³æ£èŠè¡šçŸã®çµã¿èŸŒã¿æ§æãæäœã®éè² è·ããã ããGroovyã®ã¯ããŒãžã£ã¯ãJavaãããã£ãšåã«ç»å ŽããŸããã
Groovyã¯ããªããžã§ã¯ãã®å ¥åãæ°ã«ããã«pythonã®ãããªæ§æã·ã¥ã¬ãŒã䜿çšã§ããè¿ éãªãã¹ãéçºã«æé©ã§ãã
SpockFrameworkã®æ©èœ
ãã¬ãŒã ã¯ãŒã¯ã®éèŠãªæ©èœã®1ã€ã¯ãéçºè ãBDDã¢ãããŒãã®ååã䜿çšããŠãæåŸ ãããã·ã¹ãã ç¹æ§ã§ä»æ§ãäœæã§ããããšã§ãããã®ã¢ãããŒãã«ãããäž»é¡ãšçµç¹ã®è€éæ§ãé«ããœãããŠã§ã¢è£œåã®ããžãã¹æåã®æ©èœãã¹ããäœæã§ããŸãã 仿§ã¯ãspock.lang.Specificationãæ¡åŒµããã°ã«ãŒãŽã£ãŒãªã¯ã©ã¹ã§ãã
class MyFirstSpecification extends Specification {
// fields
// fixture methods
// feature methods
// helper methods
}
BOMã«ã¯ãBOMã¯ã©ã¹ããšã«ããªã¬ãŒãããããŸããŸãªè£å©ãã£ãŒã«ããå«ããããšãã§ããŸãã
@Sharedã¢ãããŒã·ã§ã³ã䜿çšãããšã仿§ããç¶æ¿ãããã¯ã©ã¹ã«ãã£ãŒã«ããžã®ã¢ã¯ã»ã¹ãèš±å¯ã§ããŸãã
abstract class PagesBaseSpec extends Specification {
@Shared
protected WebDriver driver
def setup() {
this.driver = DriverFactory.createDriver()
driver.get("www.anywebservice.ru")
}
void cleanup() {
driver.quit()
}
}
BOMã¯ã©ã¹ã®ã«ã¹ã¿ãã€ãºã¡ãœããïŒ
def setupSpec() {} // feature
def setup() {} // feature
def cleanup() {} // feature
def cleanupSpec() {} // feature
次ã®è¡šã¯ãSpockãã¬ãŒã ã¯ãŒã¯ã®ã©ã®ããŒã¯ãŒããšã¡ãœããã«å¯Ÿå¿ããJUnitããããã瀺ããŠããŸãã
çå°ãããã¯
Spock Frameworkã§ã¯ãåãã¹ããã§ãŒãºã¯åå¥ã®ã³ãŒããããã¯ã«åå²ãããŸãïŒäŸã«ã€ããŠã¯ãããã¥ã¡ã³ããåç §ããŠãã ããïŒã
ã³ãŒãã®ãããã¯ã¯ã©ãã«ã§å§ãŸããæ¬¡ã®ã³ãŒãã®ãããã¯ã®éå§ãŸãã¯ãã¹ãã®çµäºã§çµãããŸããæå®ããã
ãããã¯ã¯ãåæãã¹ãæ¡ä»¶ã®èšå®ãæ åœããŸãã ãããã¯ããå Žåããã®åŸãåžžã«äœ¿çšäžç·ã«ãwhenãããã¯ã«ã¯ã·ã¹ãã ã®åºæ¿ãåºæ¿ãå«ãŸããthenãããã¯ã«ã¯ã·ã¹ãã ã®å¿çãå«ãŸããŸããwhen-thenå¥ãåäžã®åŒ ã«ççž®ã§ããå Žåã¯ãåäžã®expectãããã¯ã䜿çšã§ããŸãã
..ãæ¬¡ã®äŸã¯ãå ¬åŒã®Spockãã¬ãŒã ã¯ãŒã¯ããã¥ã¡ã³ããã䜿çšãããŸãã
when:
def x = Math.max(1, 2)
then:
x == 2
ãŸãã¯1ã€ã®åŒ
expect:
Math.max(1, 2) == 2
ã¯ãªãŒã³ã¢ãã ãããã¯ã¯ããã¹ãã®æ¬¡ã®å埩ã®åã«ãªãœãŒã¹ãè§£æŸããããã«äœ¿çšãããŸãã
given:
def file = new File("/some/path")
file.createNewFile()
// ...
cleanup:
file.delete()
å¥ããããïŒããŒã¿é§ååãã¹ãïŒããã¹ãããããã®ããŒã¿è»¢éã«äœ¿çšãããŸãã
def "computing the maximum of two numbers"() {
expect:
Math.max(a, b) == c
where:
a << [5, 3]
b << [1, 9]
c << [5, 9]
}
å ¥åããŒã¿è»¢éã®çš®é¡ã«ã€ããŠã¯ã以äžã§èª¬æããŸãã
SpockFrameworkã§ã®ãµã³ãã«ãã¹ãã®å®è£
次ã«ãã»ã¬ã³ã䜿çšããã·ã¹ãã ã§ã®ãŠãŒã¶ãŒèªèšŒã«ã€ããŠWebããŒãžããã¹ãããå®è£ ãžã®ã¢ãããŒããæ€èšããŸãã
import helpers.DriverFactory
import org.openqa.selenium.WebDriver
import spock.lang.Shared
import spock.lang.Specification
abstract class PagesBaseSpec extends Specification {
@Shared
protected WebDriver driver
def setup() {
this.driver = DriverFactory.createDriver()
driver.get("www.anywebservice.ru")
}
void cleanup() {
driver.quit()
}
}
ããã«ãããŒãžä»æ§ã®åºæ¬ã¯ã©ã¹ã衚瀺ãããŸããã¯ã©ã¹ã®éå§æã«ãå¿ èŠãªã¯ã©ã¹ã®ã€ã³ããŒãã衚瀺ãããŸãã以äžã¯ãç¶æ¿ãããã¯ã©ã¹ãWebãã©ã€ããŒã«ã¢ã¯ã»ã¹ã§ããããã«ããå ±æã¢ãããŒã·ã§ã³ã§ããsetupïŒïŒãããã¯ã«ã¯ãWebãã©ã€ããŒãåæåããŠWebããŒãžãéãããã®ã³ãŒãã衚瀺ãããŸããcleanupïŒïŒãããã¯ã«ã¯ãWebãã©ã€ããŒãçµäºããããã®ã³ãŒããå«ãŸããŠããŸãã
次ã«ããŠãŒã¶ãŒãã°ã€ã³ããŒãžã®ä»æ§ã®æŠèŠã«ç§»ããŸãããã
import pages.LoginPage
import spock.lang.Issue
class LoginPageTest extends PagesBaseSpec {
@Issue("QAA-1")
def "QAA-1: Authorization with correct login and password"() {
given: "Login page"
def loginPage = new LoginPage(driver)
and: "Correct login and password"
def adminLogin = "adminLogin"
def adminPassword = "adminPassword"
when: "Log in with correct login and password"
loginPage.login(adminLogin, adminPassword)
then: "Authorized and moved to main page"
driver.currentUrl == "www.anywebservice.ru/main"
}
}
æ¿èªããŒãžã®ä»æ§ã¯ãããŒã¹ããŒãžã®ä»æ§ãç¶æ¿ããŠããŸããIssueã¢ãããŒã·ã§ã³ã¯ãå€éšè¿œè·¡ã·ã¹ãã ïŒJiraãªã©ïŒã§ã®ãã¹ãã®IDãæå®ããŸããæ¬¡ã®è¡ã«ããã¹ãã®ååã衚瀺ãããŸããããã¯ãæ £äŸã«ããæååãªãã©ã«ã«ãã£ãŠèšå®ãããŸããããã«ããããã¹ãã®ååã«ä»»æã®æåïŒãã·ã¢èªãå«ãïŒã䜿çšã§ããŸããæå®ããããããã¯ã§ãèªèšŒããŒãžã¯ã©ã¹ã®ããŒãžãªããžã§ã¯ããåæåãããã·ã¹ãã ã§ã®èªèšŒçšã®æ£ãããã°ã€ã³ãšãã¹ã¯ãŒããååŸãããŸããwhenãããã¯ã§ã¯ãèš±å¯ã¢ã¯ã·ã§ã³ãå®è¡ãããŸããthenãããã¯ã¯ãäºæãããã¢ã¯ã·ã§ã³ãã€ãŸããæ¿èªã®æåãšã·ã¹ãã ã®ã¡ã€ã³ããŒãžãžã®ãªãã€ã¬ã¯ãããã§ãã¯ããããã«äœ¿çšãããŸãã
ãã®ä»æ§ã®äŸã§ã¯ãã¹ããã¯ã§BDDãã©ãã€ã ã䜿çšããããšã®æãéèŠãªå©ç¹ãããããŸããã·ã¹ãã 仿§ã¯åæã«ãã®ããã¥ã¡ã³ãã§ããåãã¹ãã¯ç¹å®ã®åäœãèšè¿°ãããã¹ãã®åã¹ãããã«ã¯ç¬èªã®èšè¿°ããããéçºè ã ãã§ãªã顧客ã«ãšã£ãŠãçè§£ã§ããŸãããããã¯ã®èª¬æã¯ããã¹ãã®ãœãŒã¹ã³ãŒãã ãã§ãªãã蚺æã¡ãã»ãŒãžããã¹ãæäœã«é¢ããã¬ããŒãã«ã衚瀺ã§ããŸãã
ãã¬ãŒã ã¯ãŒã¯ã¯ããã¹ãçšã«ããŸããŸãªãã°ã€ã³ãšãã¹ã¯ãŒãã転éããæ©èœãæäŸããŸãïŒãã¹ãã®ãã©ã¡ãŒã¿ãŒåïŒã
SpockFrameworkã§ã®ããŒã¿é§ååãã¹ã
ããŒã¿é§ååãã¹ã=ããŒãã«é§ååãã¹ã=ãã©ã¡ãŒã¿åããããã¹ã
è€æ°ã®ãã©ã¡ãŒã¿ãŒã䜿çšããŠã·ããªãªããã¹ãããã«ã¯ãããŸããŸãªãªãã·ã§ã³ã䜿çšããŠããããæž¡ãããšãã§ããŸãã
ããŒã¿ããŒãã«
å ¬åŒã®ãã¬ãŒã ã¯ãŒã¯ããã¥ã¡ã³ãããããã€ãã®äŸãèŠãŠã¿ãŸãããã
class MathSpec extends Specification {
def "maximum of two numbers"() {
expect:
Math.max(a, b) == c
where:
a | b | c
1 | 3 | 3
7 | 4 | 7
0 | 0 | 0
}
}
衚ã®åè¡ã¯ãåå¥ã®ãã¹ãå埩ã§ãããŸããããŒãã«ã¯1ã€ã®åã§è¡šãããšãã§ããŸãã
where:
a | _
1 | _
7 | _
0 | _
_BOMã¯ã©ã¹ã®ã¹ã¿ããªããžã§ã¯ãã§ãã
ãã©ã¡ãŒã¿ãããèŠãããããããã«ãäžèšã®äŸã次ã®åœ¢åŒã«æžãçŽãããšãã§ããŸãã
def "maximum of two numbers"() {
expect:
Math.max(a, b) == c
where:
a | b || c
1 | 3 || 3
7 | 4 || 7
0 | 0 || 0
}
ããã§ãaãbãå ¥åã§ãcãæåŸ å€ã§ããããšãããããŸãã
ããŒã¿ãã€ã
å Žåã«ãã£ãŠã¯ããã¶ã€ã³ããŒãã«ã®äœ¿çšãéåžžã«é¢åã«ãªããŸãããã®ãããªå Žåãæ¬¡ã®ã¿ã€ãã®ãã©ã¡ãŒã¿ãŒåãæž¡ãã䜿çšã§ããŸãã
...
where:
a << [1, 7, 0]
b << [3, 4, 0]
c << [3, 7, 0]
ããã§ãå·Šã·ãã<<ã¯ãªãŒããŒããŒããããgroovyæŒç®åã§ããããªã¹ãã«ã¢ã€ãã ã远å ãã圹å²ãæãããŸãã
ãã¹ãã®ç¹°ãè¿ãããšã«ããªã¹ãã®æ¬¡ã®ããŒã¿ã倿°ããšã«èŠæ±ãããŸã
ã1åã®ç¹°ãè¿ãïŒa = 1ãb = 3ãc = 3;
2åç®ã®ç¹°ãè¿ãïŒa = 7ãb = 4ãc = 7;
3åã®ç¹°ãè¿ãïŒa = 0ãb = 0ãc = 0ã
ããã«ãå ¥åããŒã¿ã¯æç€ºçã«éä¿¡ã§ããã ãã§ãªããå¿ èŠã«å¿ããŠããŸããŸãªãœãŒã¹ããèŠæ±ããããšãã§ããŸããããšãã°ãããŒã¿ããŒã¹ããïŒ
@Shared sql = Sql.newInstance("jdbc:h2:mem:", "org.h2.Driver")
def "maximum of two numbers"() {
expect:
Math.max(a, b) == c
where:
[a, b, c] << sql.rows("select a, b, c from maxdata")
}
ããŒã¿å€æ°ã®å²ãåœãŠ
...
where:
a = 3
b = Math.random() * 100
c = a > b ? a : b
ããã§ã¯ãåçã«èšç®ããã倿°cããã¹ãããŒã¿ã«è¡šç€ºãããŠããŸãã
ããŸããŸãªã¿ã€ãã®ãã©ã¡ãŒã¿è»¢éã®çµã¿åãã
...
where:
a | _
3 | _
7 | _
0 | _
b << [5, 0, 0]
c = a > b ? a : b
å¿ èŠã«å¿ããŠãäžåºŠã«è€æ°ã®çš®é¡ã®è»¢éã䜿çšããããšãçŠæ¢ãã人ã¯èª°ãããŸããã
SpockFrameworkã§ãã©ã¡ãŒã¿åããããã¹ããå®è£ ããäŸ
@Issue("QAA-1-parametrized")
def "QAA-1-parametrized: Authorization with correct login and password"() {
given: "Login page"
def loginPage = new LoginPage(driver)
when: "Log in with correct login and password"
loginPage.login(login, password)
then: "Authorized and moved to main page"
driver.currentUrl =="www.anywebservice.ru/main"
where: "Check for different logins and passwords"
login | password
"adminLogin" | "adminPassword"
"moderatorLogin" | "moderatorPassword"
"userLogin" | "userPassword"
}
ããã§ã¯ãæ§æãã¡ã€ã«ã«ä¿åãããŠãããã©ã¡ãŒã¿ãŒïŒãã°ã€ã³ãšãã¹ã¯ãŒãïŒã®ããŒãèšå®ãããŠããããã§ã«ããªãã¿ã®whereãããã¯ã衚瀺ãããŸãã
䜿çšããã仿§ã®å®è£ ã®ç¹æ®æ§ã«ãããWebãã©ã€ããŒã®æ§æãµã€ã¯ã«ãšãã®çµäºïŒãããã£ãŠãã©ãŠã¶ãŒã®çµäºïŒããã©ã¡ãŒã¿ãŒããšã«å®è¡ããããã¹ãã®å®è¡æéã«æªåœ±é¿ãåãŒããŸãã仿§ã宿ããããã¹ãã©ã³ã¿ã€ã ãæ¹åããããšããå§ãããŸãã
仿§ã倿Žãããã©ã¡ãŒã¿åããããã¹ãã®å®è£ äŸ
æ¹èšå
abstract class PagesBaseSpec extends Specification {
@Shared
protected WebDriver driver
def setup() {
this.driver = DriverFactory.createDriver()
driver.get("www.anywebservice.ru")
}
void cleanup() {
driver.quit()
}
}
æ¹èšåŸ
import helpers.DriverFactory
import org.openqa.selenium.WebDriver
import spock.lang.Shared
import spock.lang.Specification
abstract class PagesNoRestartBaseSpec extends Specification {
@Shared
protected WebDriver driver
def setupSpec() {
this.driver = DriverFactory.createDriver()
}
def setup() {
this.driver.get("www.anywebservice.ru")
}
def cleanup() {
this.driver.get("www.anywebservice.ru/logout")
this.driver.manage().deleteAllCookies();
}
void cleanupSpec() {
this.driver.quit()
}
}
æŽæ°ããã仿§ã§ã¯ãWebãã©ã€ããŒãäœæããæé ã¯ã仿§ã¯ã©ã¹ãèšå®ãããšãã«ã®ã¿å®è¡ããã仿§ã®ãã¹ãã®å®è¡ãçµäºããåŸã«ã®ã¿ãã©ãŠã¶ãŒãéããããšãããããŸããsetupïŒïŒã¡ãœããã§ã¯ããµãŒãã¹ã®Webã¢ãã¬ã¹ãååŸããŠãã©ãŠã¶ãŒã§éãããã®åãã³ãŒãã衚瀺ãããcleanupïŒïŒã¡ãœããã§ã¯ãwww.anywebservice.ru / logoutã«ã¢ã¯ã»ã¹ããŠãçŸåšã®ãŠãŒã¶ãŒã®ãµãŒãã¹ã®æäœãçµäºããCookieãåé€ããŸãã ïŒçŸåšã®WebãµãŒãã¹ããã¹ãããã«ã¯ããã®æé ã§ãäžæã®ãèµ·åãã·ãã¥ã¬ãŒãã§ããŸãïŒããã¹ãã³ãŒãèªäœã¯å€æŽãããŠããŸããã
ãã®çµæãç°¡åãªæ¹åã®ãããã§ãæåã®å®è£ ãšæ¯èŒããŠãèªåãã¹ãã®æäœæéãå°ãªããšã2åã®1ã«ççž®ãããŸããã
testNGãpytestãpytest-bddã®ãã¹ãã®æ¯èŒ
ãŸããJavaããã°ã©ãã³ã°èšèªã§ã®testNGãã¹ããã¬ãŒã ã¯ãŒã¯ã§ã®ãã¹ãã®å®è£ ã«ã€ããŠèª¬æããŸããããã¯ãSpock Frameworkãšåæ§ã«ãjUnitãã¬ãŒã ã¯ãŒã¯ã«è§ŠçºãããããŒã¿é§ååãã¹ãããµããŒãããŸãã
package javaTests;
import org.testng.Assert;
import org.testng.annotations.*;
import pages.LoginPage;
public class LoginPageTest extends BaseTest {
@BeforeClass
public final void setup() {
createDriver();
driver.get("www.anywebservice.ru");
}
@DataProvider(name = "userParameters")
public final Object[][] getUserData(){
return new Object[][] {
{"adminLogin", "adminPassword"},
{"moderatorLogin", "moderatorPassword"},
{"userLogin", "userPassword"}
};
}
@Test(description = "QAA-1-1: Authorization with correct login and password",
dataProvider = "userParameters")
public final void authorizationWithCorrectLoginAndPassword(String login, String password){
//Login page
LoginPage loginPage = new LoginPage(driver);
//Log in with correct login and password
loginPage.login(login, password);
//Authorized and moved to main page
Assert.assertEquals("www.anywebservice.ru/main", driver.getCurrentUrl());
}
@AfterMethod
public final void cleanup() {
driver.get("www.anywebservice.ru/logout");
driver.manage().deleteAllCookies();
}
@AfterClass
public final void tearDown() {
driver.quit();
}
}
ããã§ã¯ãå¿ èŠãªãã¹ãŠã®setupïŒïŒãcleanupïŒïŒã¡ãœãããå«ããã¹ãã¯ã©ã¹ãããã³@DataProviderã¢ãããŒã·ã§ã³ã䜿çšãã远å ã®getUserDataïŒïŒã¡ãœããã®åœ¢åŒã§ã®ãã¹ãã®ãã©ã¡ãŒã¿ãŒåã確èªã§ããŸããããã¯ãSpockã䜿çšãããã¹ãã§èª¿ã¹ãåŸã¯å°ãé¢åã«èŠããŸãããã¬ãŒã ã¯ãŒã¯ããŸãããã¹ãã§äœãèµ·ãã£ãŠããã®ããçè§£ããããã«ãæé ã®èª¬æãšåæ§ã®ã³ã¡ã³ããæ®ãããŸããã
testNGã¯ãSpock Frameworkãšã¯ç°ãªãã䞊åãã¹ãå®è¡ããµããŒãããŠããããšã«æ³šæããŠãã ããã
次ã«ãPythonããã°ã©ãã³ã°èšèªã§pytestãã¹ããã¬ãŒã ã¯ãŒã¯ã䜿çšãããã¹ãã«ç§»ããŸãããã
import pytest
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWait
from PageObjects.LoginPage import LoginPage
class TestLogin(object):
@pytest.mark.parametrize("login,password", [
pytest.param(("adminLogin", "adminPassword"), id='admin'),
pytest.param(("moderatorLogin", "moderatorPassword"), id='moderator'),
pytest.param(("userLogin", "userPassword"), id='user')
])
def test_authorization_with_correct_login_and_password(self, login, password, driver, test_cleanup):
# Login page
login_page = LoginPage(driver)
# Log in with correct login and password
login_page.login(login, password)
# Authorized and moved to main page
assert expected_conditions.url_to_be("www.anywebservice.ru/main")
@pytest.fixture()
def test_cleanup(self, driver):
yield "test"
driver.get("www.anywebservice.ru/logout")
driver.delete_all_cookies()
ããã§ã¯ãtestNGã®@DataProviderãšåæ§ã«ãããŒã¿é§ååãã¹ãã®ãµããŒããå¥åã®æ§æãšããŠè¡šç€ºãããŸããWebãã©ã€ããŒãæ§æããæ¹æ³ã¯ããã©ã€ããŒãã£ã¯ã¹ãã£ã«ãé衚瀺ãã«ãªã£ãŠããŸããåçåä»ããšpytestãã£ã¯ã¹ãã£ã®ãããã§ããã®ãã¹ãã®ã³ãŒãã¯Javaããããããã«èŠããŸãã
次ã«ãpytest-bddãã©ã°ã€ã³ã䜿çšãããã¹ãã³ãŒãã®æŠèŠã«ç§»ããŸããããããã«ãããGherkinæ©èœãã¡ã€ã«ã®åœ¢åŒã§ãã¹ããèšè¿°ã§ããŸãïŒçŽç²ãªBDDã¢ãããŒãïŒã
login.feature
Feature: Login page
A authorization
Scenario: Authorizations with different users
Given Login page
When Log in with correct login and password
Then Authorized and moved to main page
test_login.py
import pytest
from pytest_bdd import scenario, given, when, then
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWait
from PageObjects.LoginPage import LoginPage
@pytest.mark.parametrize("login,password", [
pytest.param(("adminLogin", "adminPassword"), id='admin'),
pytest.param(("moderatorLogin", "moderatorPassword"), id='moderator'),
pytest.param(("userLogin", "userPassword"), id='user')
])
@scenario('login.feature', 'Authorizations with different users')
def test_login(login, password):
pass
@given('Login page')
def login_page(driver):
return LoginPage(driver)
@when('Log in with correct login and password')
def login_with_correct_login_and_password(login_page, login, password):
login_page_object = login_page
login_page_object.login(login, password)
@then('Authorized and moved to main page')
def authorized_and_moved_to_main_page(driver, login):
assert expected_conditions.url_to_be("www.anywebservice.ru/main")
å©ç¹ã®1ã€ã¯ããã¹ãã䞊è¡ããŠå®è¡ãããªã©ãããŸããŸãªç¶æ³ã«å¯Ÿå¿ããå€ãã®ãã©ã°ã€ã³ãåããpytestãã¬ãŒã ã¯ãŒã¯ã§ãããšããããšã§ããæ¬ ç¹ã¯ãçŽç²ãªBDDã¢ãããŒãèªäœã§ãããéçºè ãç¬èªã®ç¹æ§ã§åžžã«å¶éããŸããSpock Frameworkã䜿çšãããšãPyTest + pytest-bddãã³ãã«ãšæ¯èŒããŠãããç°¡æœã§èšèšã容æãªã³ãŒããèšè¿°ã§ããŸãã
çµè«
ãã®èšäºã§ã¯ãSpockãã¬ãŒã ã¯ãŒã¯ã䜿çšããŠBDDã®æäœãç°¡çŽ åããæ¹æ³ã«ã€ããŠèª¬æããŸãããèŠçŽãããšãç§ãã¡ã®æèŠã§ã¯ãä»ã®ããã€ãã®äžè¬çãªãã¹ããã¬ãŒã ã¯ãŒã¯ãšæ¯èŒããSpockã®äž»ãªé·æãšçæãç°¡åã«åŒ·èª¿ããŸãããã
é·æïŒ
- çŽç²ãªBDDã¢ãããŒãã®ä»£ããã«BDDååã䜿çšãããšããã¹ããäœæããéã®æè»æ§ãé«ãŸããŸãã
- æžé¢ã«ãããã¹ã仿§ã¯ãã·ã¹ãã ã®ããã¥ã¡ã³ãã§ããããŸãã
- .
- groovy ( , , closures ).
:
- groovy. , , IDE , . Intellij IDEA, , , , .
- groovy JVM -. , groovy, , . java, groovy .
- ããšãã°ãæ¡åŒµæ©èœã®ã»ããã¯testNGã»ã©åºç¯å²ã§ã¯ãããŸããããã®çµæããã¹ãã®äžŠåå®è¡ã¯ãããŸããããã®æ©èœã远å ããèšç»ããããŸããããããã®å®è£ ã®ã¿ã€ãã³ã°ã¯äžæã§ãã
æçµçã«ãSpock Frameworkã¯ãäž»é¡ãšçµç¹ãéåžžã«è€éãªãœãããŠã§ã¢è£œåã®ããžãã¹ã·ããªãªãèªååãããšããè€éã§äžè¬çãªåé¡ã解決ããã®ã«é©ããŠãããããééããªã泚ç®ã«å€ããŸãã
ä»ã«äœãèªãããšãã§ããŸããïŒ