我该如何打破这些登录命令的使用,以使测试更干燥?
#1 楼
squeemish和Phil提供了很好的建议。我要补充他们的出色答案:如果您使用Selenium IDE通过记录创建测试,请停止这样做。学习(很快)如何以您选择的编程语言从头开始编写测试。仅使用Selenium IDE(和其他记录和回放工具)来探索和尝试想法。
我的建议是,记录和回放工具无法了解您的意图。 ,或者是什么使给定的UI gizmo变得有趣。它所知道的只是您单击它或在其中键入了一些内容。因此,它永远无法生成挤压和Phil描述的有意义的抽象类型。
一种学习如何从头开始编写测试的方法是从通过Selenium IDE创建的测试开始。注意什么“代码异味”最困扰您测试。了解应用什么重构来消除异味。漂洗并重复直到测试具有表现力和可维护性。然后在下一个测试中再次进行。
随着时间的流逝,您将了解到想要的测试外观。然后,您可以使用所学的知识从头开始编写好的测试。
与刚接触自动化测试的新手一起,我倾向于关注三个原则:
删除重复项
命名每个重要的想法
隐藏偶然的细节
这里有一篇论文,我举了一个例子来说明如何做:http://dhemery.com/ pdf / writing_maintainable_automated_acceptance_tests.pdf
在此示例中,我停留在该工具(机器人框架)中,而不是改用更通用的编程语言。但是原理是一样的。这是鲍勃·马丁(Bob Martin)使用不同的测试工具(FitNesse)应用相同原理的精彩视频:http://blog.objectmentor.com/articles/2009/12/07/writing-maintainable-automated-acceptance-tests
评论
每次完全从头开始编写每个测试可能是过大的选择。根据您的情况和工具,记录测试,然后从中完善生活日光可能就足够了。无论如何,+ 1。
–user867
2012年10月4日,0:38
这是学习从头开始编写测试的好方法。从记录和修改开始,然后过一会儿您将熟悉语言和期望
–挤压
2012年10月4日13:44
#2 楼
阅读页面对象,例如http://code.google.com/p/selenium/wiki/PageObjectshttp://www.theautomatedtester.co.uk/tutorials/selenium/page-object -pattern.htm
http://www.ralphlavelle.net/2012/08/the-page-object-pattern-for-ui-tests.html
#3 楼
使用一个Abstract类。我将整个登录过程放在一个抽象类中,并在测试中首先调用该方法。如果需要更改任何凭据,则只需在一个地方更改它们。我的抽象类中的方法:
protected void getBaseURLAndLoginTestUser() throws Exception
{
driver.get(BASE_URL);
assertEquals("some text here", findElementBySelector("h3").getText());
WebElement userName = findElementById("j_username");
userName.clear();
userName.sendKeys("testing1");
WebElement password = findElementById("j_password");
password.clear();
password.sendKeys("testing1");
WebElement loginButton = findElementById("modalDialogButton");
loginButton.click();
}
然后在我的摘要的另一种方法中使用它:
protected void setup() throws Exception
{
getBaseURLAndLoginTestUser();
WebElement selectRole = findElementByXpath("//div[@id='selectRoles']/ul/li[text()='loginRole (Dept C)']");
selectRole.click();
Thread.sleep(2000);
WebElement continueButton = findElementById("continue");
continueButton.click();
Thread.sleep(2500);
assertEquals("some text here", findElementBySelector("header.container_12.clearfix > h1").getText());
String destinationUrl = navigateToUrl(getNavigationUrl());
driver.get(destinationUrl);
}
最后,在我的测试类中看到的是:
public class NameOfClass extends AbstractClass
{
@Override
@BeforeClass
public void setup() throws Exception
{
super.setup();
}
}
我必须使用
super
,因为我更改了导航到的URL,该URL包含在另一个抽象类中。评论
线程睡眠没有检查任何条件?为什么是2500毫秒而不是2600毫秒?
– dzieciou
13年4月11日在19:08
线程睡眠使用情况参差不齐。建立Web应用程序的方式,启用/禁用按钮以及如何检查按钮非常困难。我们还没有找到更好的方法。
–挤压
13年4月12日在11:40
#4 楼
我建议您使用RobotFramework + SeleniumLibrary来测试网站(在这里可以找到演示http://code.google.com/p/robotframework-seleniumlibrary/wiki/Demo)。您可以声明要在TC中使用的变量,因此,如果您更改密码,则不必在每个TC中都更改
# global variables --
${user} username
${password} password
# tc --
...
Input Text usr ${user}
Input Password pwd ${password}
...
您可以在此处查看更多信息:
http://robotframework-seleniumlibrary.googlecode.com/hg/doc/SeleniumLibrary.html?r=2.5#Input%20Text
#5 楼
首先,其他人都说过。我建议您的第一个目标应该是学习如何将测试用例拆分为可重用的块,以便您的登录名是由其他所有方法。
我使用的方法(与工具无关)是将一个测试用例定义为包含一个或多个测试动作,每个动作都包含一个或多个步骤,因此一个测试用例(例如)登录到网上商店并订购商品会分解为以下一系列操作:
运行目标浏览器
加载条目URL
以用户身份登录
选择项目y的数量x
选择付款方式
检查确认页
退出浏览器
每个动作都可以在任何测试用例中使用,因此您只需要一个地方存在的登录步骤。
我通常还会使动作具有参数,以便我可以对不同的数据重用该动作。因此,登录操作将采用一个指向测试用例所需用户的标识符,然后细分为以下步骤:
检索用户登录名“ testuser1”的用户详细信息
输入用户名
输入用户密码
单击登录按钮
验证成功操作
(当然,如果您在用户中包含成功/失败信息,详细信息,无论您是登录用户还是无效的密码消息,都可以调用具有预期结果的“成功操作”。
我发现-通过开始操作,并处理越来越多的相同或几乎相同的代码-以这种方式模块化您的测试用例有助于保持事物的清洁和易于维护。
#6 楼
为了解决这个问题,我要做的是在测试套件的开头创建一个测试用例,使用store
命令设置我所有的公共变量(测试用户,测试公司,内部版本号等)。然后,我创建一个测试用例,使用通用变量测试用例中的变量登录。后续测试用例还使用第一个测试用例中的变量来运行测试。实际上,然后我可以创建其他测试套件,并在顶部添加公共变量测试用例,以便我的所有测试套件都可以使用相同的变量。仅此一项就使我免于头痛。例如,您可以假设有一个名为
commonvariables.html
的测试用例:store|http://websitetobetested.com/|baseURL
store|johndoe@hotmail.com|username
store|mypassword|password
然后还有一个称为
login.html
的测试用例:从这里开始,您可以重用相同的测试用例,甚至可以更改变量,但可以在不同的套件中使用相同的测试用例。我希望这会有所帮助。
#7 楼
如果您使用的是Selenium IDE,请参见SeLite及其附加组件SelBlocks Global-https://code.google.com/p/selite/wiki/SelBlocksGlobal。它有助于测试被打包,可重用,可配置(因此更易于维护)。它通过功能(在测试用例之间共享),循环和其他代码结构提高了测试的重用性。因此,您可以在一个测试用例中定义一个函数,然后从其他测试用例中调用它。 />
评论
你用什么语言编码,杰森?我同意Phil关于页面对象的观点,但是其他可能对您有用的是我对这个问题的回答:sqa.stackexchange.com/questions/3798/…