Cod*_*ice 5 python testing selenium pytest
我目前正在使用pytest和Selenium测试一个Web应用程序.所有页面都有"Home"和"Log Out"链接,所以我写了一个这样的测试:
def test_can_log_out(page):
link = page.find_element_by_partial_link_text('Log Out')
link.click()
assert 'YOU HAVE SUCCESSFULLY LOGGED OFF!' in starting_page.page_source
Run Code Online (Sandbox Code Playgroud)
现在对于page夹具,我正在模拟登录过程.我把它分成了几个装置:
获取Selenium WebDriver实例
@pytest.fixture()
def browser(request, data, headless):
b = webdriver.Firefox(executable_path=DRIVERS_PATH + '/geckodriver')
yield b
b.quit()
Run Code Online (Sandbox Code Playgroud)登录Web应用程序
@pytest.fixture()
def login(browser):
browser.get('http://example.com/login)
user_name = browser.find_element_by_name('user_name')
user_name.send_keys('codeapprentice')
password = browser.find_element_by_name('password')
password.send_keys('password1234')
submit = browser.find_element_by_name('submit')
submit.click()
return browser
Run Code Online (Sandbox Code Playgroud)访问页面
@pytest.fixture()
def page(login):
link = login.find_element_by_partial_link_text('Sub Page A')
link.click()
return login
Run Code Online (Sandbox Code Playgroud)这非常有效,我可以测试从此页面注销.现在我的问题是我有另一个页面可以从"页面A"访问:
@pytest.fixture()
def subpage(page):
button = login.find_element_name('button')
button.click()
return page
Run Code Online (Sandbox Code Playgroud)
现在我想用这个灯具运行完全相同的测试.当然,我可以复制/粘贴并进行一些更改:
def test_can_log_out_subpage(subpage):
link = page.find_element_by_partial_link_text('Log Out')
link.click()
assert 'YOU HAVE SUCCESSFULLY LOGGED OFF!' in starting_page.page_source
Run Code Online (Sandbox Code Playgroud)
但是,这违反了DRY原则.test_can_log_out()如果没有这种重复,我该如何重用?
在这里,您可以传递您fixtures的页面和子页面在测试参数中,这些参数将作为测试的第一步动态调用.如下.
当灯具位于测试所在的同一页面时:
testfile.py
import pytest
class TestABC():
@pytest.fixture
def browser(self,request):
print "browser"
@pytest.fixture
def login(self,request,browser):
print "login"
@pytest.fixture
def subpage1(self,request,login):
print "subpage1"
@pytest.fixture
def subpage2(self, request, login):
print "subpage2"
@pytest.fixture
def subpage3(self, request, login):
print "subpage3"
@pytest.mark.parametrize('sub_page',
['subpage1', 'subpage2', 'subpage3'])
def test_can_log_out_subpage(self,sub_page,request):
request.getfuncargvalue(sub_page)
print "test output of ", sub_page
Run Code Online (Sandbox Code Playgroud)
输出:
browser
login
subpage1
test output of subpage1
browser
login
subpage2
test output of subpage2
browser
login
subpage3
test output of subpage3
Run Code Online (Sandbox Code Playgroud)
当灯具处于conftest.py时
import pytest
@pytest.fixture
def browser(request):
print "browser"
@pytest.fixture
def login(request):
print "login"
@pytest.fixture
def subpage1(request,login):
print "subpage1"
@pytest.fixture
def subpage2(request, login):
print "subpage2"
@pytest.fixture
def subpage3(request, login):
print "subpage3"
Run Code Online (Sandbox Code Playgroud)
testfile.py
import pytest
class TestABC():
@pytest.mark.parametrize('sub_page',
['subpage1', 'subpage2', 'subpage3'])
def test_can_log_out_subpage(self,sub_page,request):
request.getfuncargvalue(sub_page)
print "test output of ", sub_page
Run Code Online (Sandbox Code Playgroud)
在这里,您还将获得与上面相同的输出.
希望它会对你有所帮助.
一般来说 :
@pytest.fixture(scope="function")
def fixture_one():
# set up things
yield
# teardown
@pytest.fixture(scope="function")
def fixture_two():
# do things
@pytest.mark.parametrize('fixture_func', [fixture_one, fixture_two])
def test_things(fixture_func, request):
request.getfixturevalue(fixture_func.__name__)
assert foo == bar
Run Code Online (Sandbox Code Playgroud)
这是我设计的一个例子来演示灯具的重用。一个固定装置可以引用另一个固定装置 - 允许采用分层方法来编写测试。请看看哪一款适合您:
import pytest
@pytest.yield_fixture()
def browser():
print("Launching browser")
b = {}
yield b
print("quitting browser")
@pytest.fixture()
def login(browser):
print("logging in")
@pytest.fixture()
def page(login):
print("on page")
@pytest.fixture()
def subpage(page):
print("on subpage")
@pytest.yield_fixture()
def logout(page):
yield page
print('performing logout using fixtures')
def test_can_log_out(page):
print("logging out using test")
pass
def test_can_log_style2(logout):
print("logging out using fixture")
pass
def test_logout_page2(subpage, logout):
print("test can logout from page 2")
pass
def test_logout_page2_style2(subpage):
print("test can logout from page 2 style2")
test_can_log_out(subpage)
pass
Run Code Online (Sandbox Code Playgroud)
test_can_log_out 的输出
Launching browser
logging in
on page
.logging out using test
quitting browser
Run Code Online (Sandbox Code Playgroud)
test_can_log_style2 的输出
Launching browser
logging in
on page
.logging out using fixture
performing logout using fixtures
quitting browser
Run Code Online (Sandbox Code Playgroud)
test_logout_page2 的输出
Launching browser
logging in
on page
on subpage
.test can logout from page 2
performing logout using fixtures
quitting browser
Run Code Online (Sandbox Code Playgroud)
test_logout_page2_style2 的输出
Launching browser
logging in
on page
on subpage
.test can logout from page 2 style2
logging out using test
quitting browser
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2422 次 |
| 最近记录: |