Rational Functional Tester - Как получить сценарии, вызываемые из родительского сценария, для использования пула данных родителя? - PullRequest
2 голосов
/ 24 июля 2010

Я довольно новичок в Rational Functional Tester (Java), но у меня есть один большой пробел.У меня есть приложение, которое находится в гибкой среде разработки, поэтому некоторые экраны могут изменяться по мере появления новых интерфейсов.

По этой причине я пытаюсь модулировать свои тестовые сценарии.Например: я хотел бы иметь сценарий входа в систему, сценарий поиска и сценарий выхода из системы.

Затем я бы сшил их вместе (псевдокод)

Call Script components.security.Login;
Call Script components.search.Search;
//verification point
Call Script components.security.Logout;

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

Затем я бы вызвал этот сценарий, скажем, "TestSituation_001".Было бы необходимо сослаться на несколько различных пулов данных.В этом случае пул данных пользователя (вместо пула данных superUser) и пул данных TestSituation_001 или, возможно, некоторые другие пулы данных.Точка верификации будет использовать ситуационный пул данных для своей проверки.

Так вот, я бы сделал это в идеальном мире.На данный момент меня беспокоит то, что мне нужно сделать что-то совершенно другое, чтобы дочерние сценарии унаследовали родителей.

Итак, мои вопросы таковы:

  1. Почему дочерние сценарии просто не наследуют пул данных вызывающего сценария?
  2. Как я могу заставить их это делать?
  3. Не делаю ли я неверные предположения о том, как это должно работать?
  4. Если № 3 истинно, то как мне лучше?

В качестве примечания, я не возражаю взломать какую-то Java, чтобы она заработала.

Спасибо!

1 Ответ

2 голосов
/ 24 июля 2010

Я решил свою проблему. Для тех из вас, кто интересуется, проверьте это:

public abstract class MyTestHelper extends RationalTestScript
{

    protected void useParentDataPool() {
        if(this.getScriptCaller() != null) {
            IDatapool dp = this.getScriptCaller().getDatapool();
            IDatapoolIterator iterator = DatapoolFactory.get().open(dp, "");
            if(dp != null && iterator != null) {
                //if the datapool is not null, substitute it for the current data pool
                this.dpInitialization(dp, iterator);
            }                           
        }
    }

}

Это также будет использовать тот же итератор. Удачной охоты ...

На самом деле, после некоторого размышления я создал метод, который заставлял бы любой данный скрипт использовать DataPool корневого скрипта вызова. Опять же, счастливой охоты тем, кому это нужно ...

/*
 * preconditions:  there is a parent caller
 * postconditions: the current script is now using the same datapool / datapool iterator as the root script
 */
protected void useRootDataPool() {
    //if there is no parent, then this wouldn't work so return with no result;
    if(this.getScriptCaller() == null) return;

    //assume that we're at the root node to start
    RationalTestScript root = this;
    while(root.getScriptCaller() != null) {
        root = root.getScriptCaller();
    }

    //if this node is the root node, no need to continue.  the default attached datapool will suffice.
    if(this.equals(root)) return;

    //get the root's data pool (which would be the parent's parent and so on to the topmost)
    IDatapool dp = root.getDatapool();
    if(dp != null) {
        //check to make sure that we're not trying to re-initialize with the same datapool (by name)
        //if we are, then leave
        if(dp.getName().equals(this.getDatapool().getName())) return;

        //this basically says "give me the iterator already associated to this pool"
        IDatapoolIterator iterator = DatapoolFactory.get().open(dp, "");
        //if we have an iterator AND a data pool (from above), then we can initialize
        if(iterator != null) {
            //this method is never supposed to be run, but this works just fine.
            this.dpInitialization(dp, iterator);
            //log information
            logInfo("Using data pool from root script: " + root.getScriptName());
        }
    }
}
...