Выпуск обслуживания кода селена - PullRequest
3 голосов
/ 16 марта 2010

Я хочу сгруппировать общие методы в один файл и использовать его. Например, вход на страницу с использованием селена может использоваться несколько раз. Определите это в классе A и назовите это в классе B. Однако, это вызывает исключение нулевого указателя.

класс А имеет

public void test_Login() throws Exception
    {
        try{
        selenium.setTimeout("60000");
        selenium.open("http://localhost");
        selenium.windowFocus();
        selenium.windowMaximize();
        selenium.windowFocus();
        selenium.type("userName", "admin");
        selenium.type("password", "admin");
        Result=selenium.isElementPresent("//input[@type='image']");
        selenium.click("//input[@type='image']");
        selenium.waitForPageToLoad(Timeout);
        }
        catch(Exception ex)
        {   
            System.out.println(ex);
            ex.printStackTrace();
        }
    }

со всем другим синтаксисом Java

в классе B

public void test_kk() throws Exception
    {

        try
        {
            a.test_Login();
        }
        catch(Exception ex)
        {
            System.out.println(ex);
            ex.printStackTrace();
        }
    }

со всем синтаксисом.

Когда я выполняю класс B, я получаю эту ошибку,

java.lang.NullPointerException
        at A.test_Login(A.java:32)
        at B.test_kk(savefile.java:58)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at junit.framework.TestCase.runTest(TestCase.java:168)
        at junit.framework.TestCase.runBare(TestCase.java:134)
        at com.thoughtworks.selenium.SeleneseTestCase.runBare(SeleneseTestCase.j
ava:212)
        at junit.framework.TestResult$1.protect(TestResult.java:110)
        at junit.framework.TestResult.runProtected(TestResult.java:128)
        at junit.framework.TestResult.run(TestResult.java:113)
        at junit.framework.TestCase.run(TestCase.java:124)
        at junit.framework.TestSuite.runTest(TestSuite.java:232)
        at junit.framework.TestSuite.run(TestSuite.java:227)
        at junit.textui.TestRunner.doRun(TestRunner.java:116)
        at junit.textui.TestRunner.doRun(TestRunner.java:109)
        at junit.textui.TestRunner.run(TestRunner.java:77)
        at B.main(B.java:77)

Надеюсь, кто-то уже пробовал это раньше. Я могу что-то здесь упустить.

Ответы [ 2 ]

2 голосов
/ 19 марта 2010

У нас есть вспомогательные классы со статическими методами. В реальных тестовых случаях мы настраиваем наш объект селена и передаем объект в статический метод, чтобы он мог работать с ним.

public BaseHelper
{
    public static login( final String username, final String password, final DefaultSelenium selenium )
    {
     selenium.type("userName", username);
     selenium.type("password", password);
     selenium.click("loginbutton");
    }
}


public LoginTest
{
    DefaultSelenium selenium;

    onSetup()
    {
      selenium = new DefaultSelenium(...);
    }  

    public testLogin()
    {
      BaseHelper.login( "admin", "admin", selenium);
      // assert that this passed
      BaseHelper.login( "foo", "bar", selenium);
      // assert this failed because no user 'foo'
      BaseHelper.login( "admin", "bar", selenium);
      // assert this failed because admin's password was incorrect
    }
}

Надеюсь, это иллюстрирует суть.

Помимо лучшей читабельности и простоты обслуживания, вы также можете тестировать многопользовательское поведение, создавая два (или более) объектов селена и передавая их в тестах.

1 голос
/ 16 марта 2010

Как инициализируется объект селена в классе A? Вы помните, чтобы передать его оттуда, где он создается в классе B? Если это так, то трудно увидеть, когда эта часть кода не включена ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...