Перейти к содержимому

Фотография

отделение данных от теста


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 13

#1 keja04

keja04

    Новый участник

  • Members
  • Pip
  • 18 сообщений
  • ФИО:Natalia

Отправлено 19 июля 2012 - 14:39

Как отделить данные от теста? Например, чтобы имя пользователя и пароль находились отдельно, а не так driver.findElement(By.id("forlogin")).sendKeys("keja04");
  • 0

#2 user12

user12

    Специалист

  • Members
  • PipPipPipPipPip
  • 897 сообщений
  • ФИО:Виктор
  • Город:Минск


Отправлено 19 июля 2012 - 15:11

Как отделить данные от теста? Например, чтобы имя пользователя и пароль находились отдельно, а не так driver.findElement(By.id("forlogin")).sendKeys("keja04");


Существует огромное число вариантов:
а)использовать проперти-файлы
б)создавать классы с константами
в)xml
....

Завтра, если не забуду, распишу подробно
  • 0

#3 user12

user12

    Специалист

  • Members
  • PipPipPipPipPip
  • 897 сообщений
  • ФИО:Виктор
  • Город:Минск


Отправлено 20 июля 2012 - 07:01

проперти - файл:
а)правая кнопка по проекту NEW--FILE
б)создать файл system.properties
в)открыть его
г)заполнить такими данными
#login - решетка это комментарии !!!
login = keja04 #никаких кавычек не нужно !!!
д)создать метод

public static String getDataProperties (String param) throws Exception {
Properties props=new Properties();
props.load(new InputStreamReader(new FileInputStream("system.properties"), "UTF-8"));
return props.getProperty(param);
}

е)Теперь, чтобы взять данные из проперти,
используем ИмяКласса.getDataProperties('login ')
кавычки обязательно использовать

ж)Проблема с русскими буквами при сохранении выдаст ошибку:
поэтому кликай на кнопку "Save in UTF-8" как-то так называется
и ты сможешь брать русские буквы
  • 1

#4 ashipovalov

ashipovalov

    Активный участник

  • Members
  • PipPip
  • 142 сообщений
  • ФИО:Шиповалов Александр


Отправлено 23 июля 2012 - 03:08

А способ с классами -константами? А как создается карта пользовательского интерфейса?
  • 0

#5 s.kaliberda

s.kaliberda

    Новый участник

  • Members
  • Pip
  • 22 сообщений
  • ФИО:Kaliberda Sergey
  • Город:Dnipropetrovsk

Отправлено 23 июля 2012 - 09:02

Можно еще хранить тестовые данные в Excel файлах. У нас на проекте этот метод показался самым удобным, потомучто у на было очень много тестовых данных.
Для Java можно использовать библиотеку apache poi.
  • 0

#6 neman

neman

    Активный участник

  • Members
  • PipPip
  • 142 сообщений
  • ФИО:Антон


Отправлено 24 июля 2012 - 20:18

Странно, что никто не упомянул @DataProvider (TestNG). Впрочем, это скорее для генерирования тестовых данных, чем для хранения.
  • 0

#7 gausner

gausner

    Новый участник

  • Members
  • Pip
  • 9 сообщений


Отправлено 28 сентября 2012 - 14:02

е)Теперь, чтобы взять данные из проперти,
используем ИмяКласса.getDataProperties('login ')
кавычки обязательно использовать


Добрый день,

Спасибо за информаци.
А не подскажете, как из другого класса вызвать значение поля login?
Я написал код

package com.example.tests;

public class TestTest {

public static void main(String[] args) throws Exception {
String loginValue = PropertiesReaderThird.getDataProperties("login");
System.out.println(loginValue );
}
}

А мне возвращается null (
  • 0

#8 user12

user12

    Специалист

  • Members
  • PipPipPipPipPip
  • 897 сообщений
  • ФИО:Виктор
  • Город:Минск


Отправлено 01 октября 2012 - 06:26

PropertiesReaderThird - это название другого класса, если ДА, то я не вижу ошибок.

Вы точно сделали все импорты ?

Скиньте весь код, который у вас есть.
  • 0

#9 gausner

gausner

    Новый участник

  • Members
  • Pip
  • 9 сообщений


Отправлено 01 октября 2012 - 11:55

PropertiesReaderThird - это название другого класса, если ДА, то я не вижу ошибок.

Вы точно сделали все импорты ?

Скиньте весь код, который у вас есть.


Большое Вам спасибо за ответ.
Я протормозил и в String loginValue = PropertiesReaderThird.getDataProperties("browser"); указывал вместо "browser" несуществующий в файле пропертиз параметр.
Можно задать Вам ещё один вопрос? Сейчас у меня получается получить поля browser, port, url из файла properties.
И начинается самое интересное. Как их передать методу, который будет вызывать Selenium?

public class startSelenium {

protected static DefaultSelenium selenium;
@BeforeSuite
public void setUp(String browser, int port, String url) throws Exception {
selenium = new DefaultSelenium("localhost", port, browser, url);
selenium.start();

}

@AfterSuite
public void tearDown() throws Exception {
selenium.stop();
}
}
Когда я пытаюсь вызвать из этого класса например String browser = PropertiesReaderThird.getDataProperties("browser"); - у меня выходит ошибка (
  • 0

#10 user12

user12

    Специалист

  • Members
  • PipPipPipPipPip
  • 897 сообщений
  • ФИО:Виктор
  • Город:Минск


Отправлено 01 октября 2012 - 12:18

Вы используете Selenium RC
В метод SetUp не надо ничего передавать

selenium = new DefaultSelenium(ИмяКласса.getDataProperties("Server"), ИмяКласса.getDataProperties("Port") и т.п.


А у вас вообще как-то странно написано:

public void setUp(String browser, int port, String url) throws Exception {
selenium = new DefaultSelenium("localhost", port, browser, url);
}
Где Ваш метод возьмет данные для порта, браузера и урла ?
  • 0

#11 gausner

gausner

    Новый участник

  • Members
  • Pip
  • 9 сообщений


Отправлено 02 октября 2012 - 11:19

Вы используете Selenium RC
В метод SetUp не надо ничего передавать

selenium = new DefaultSelenium(ИмяКласса.getDataProperties("Server"), ИмяКласса.getDataProperties("Port") и т.п.


А у вас вообще как-то странно написано:

public void setUp(String browser, int port, String url) throws Exception {
selenium = new DefaultSelenium("localhost", port, browser, url);
}
Где Ваш метод возьмет данные для порта, браузера и урла ?


User12, спасибо большое за советы. Вы помогли мне невероятным образом.
Да, я использую RC, хочу понять как он работает.
По поводу того, где брать параметры на вход. Вот смотрите, долго мучился но получил в итоге работающий код. В нём на вход методу setUp подаём переменную propertiesData.

public class PropsReader {

protected static DefaultSelenium selenium;

@Parameters ({ "propertiesData"})
@BeforeSuite
public void setUp (@Optional String propertiesData) throws Exception {
if (propertiesData == null){
propertiesData = "application.properties";
}
String cmdLineFile = System.getProperty("propertiesExternalData");
if (cmdLineFile !=null){
propertiesData= cmdLineFile;
}
Properties props = new Properties();
props.load(new FileInputStream(propertiesData));

int port = Integer.parseInt(props.getProperty("port"));

selenium = new DefaultSelenium("localhost", port, props.getProperty("browser"), props.getProperty("url"));
selenium.start();
}

Зачем я всё это наделал.
Я хочу попробовать запустить из командной строки тестовый набор в формате: набор "браузер, порт и урл из файла external.properties" + набор тестов из файла скажем test.xml.
И вот теперь не пойму, как мне это сделать, не будете ли Вы столь любезны, что подскажете как? Точнее, написать соответствующий bat-файл.
Мне приходит в голову только java -DpropertiesExternalData=external.properties, но вот что там дальше писать?

P.S. Чтобы можно было запускать тесты из эклипса, пишу propertiesData = "application.properties";
  • 0

#12 gausner

gausner

    Новый участник

  • Members
  • Pip
  • 9 сообщений


Отправлено 02 октября 2012 - 13:11

Написал вот такой батник.

set javaTestProjectPath=d:\testing\automatedtesting\Eclipse\workspace\My project\
set TESTNGFILE=test.xml
set path=c:\Program Files\Java\jre7\bin\
set SELENIUM_HOME=d:\testing\automatedtesting\distr\selenium-java-2.25.0\selenium-2.25.0
set TESTNG_HOME=d:\testing\automatedtesting\Eclipse\plugins\org.testng.eclipse_6.7.0.20120715_0816
set CLASSPATH=%javaTestProjectPath%\bin;%TESTNG_HOME%\lib\testng.jar;%SELENIUM_HOME%\selenium-java-2.25.0.jar;%SELENIUM_HOME%\libs\*.jar
java org.testng.TestNG %* class.xml

Запускаю - oткрывается на секунду черное окно и сразу закрывается (
Что я не так делаю? В самом эклипсе тесты запускаются нормально.

В логах в test-output читаю


<?xml version="1.0" encoding="UTF-8" ?>
- <testng-results skipped="1" failed="0" total="1" passed="0">
<reporter-output />
- <suite name="Default suite" duration-ms="7" started-at="2012-10-02T14:05:57Z" finished-at="2012-10-02T14:05:57Z">
- <groups>
- <group name="BUG">
<method signature="addNewAccount.testAddNewGroup()[pri:0, instance:com.example.tests.addNewAccount@1557ee8]" name="testAddNewGroup" class="com.example.tests.addNewAccount" />
</group>
- <!-- BUG
-->
</groups>
- <test name="Default test" duration-ms="7" started-at="2012-10-02T14:05:57Z" finished-at="2012-10-02T14:05:57Z">
- <class name="com.example.tests.addNewAccount">
- <test-method status="FAIL" signature="setUp(java.lang.String, int, java.lang.String)[pri:0, instance:com.example.tests.addNewAccount@1557ee8]" name="setUp" is-config="true" duration-ms="0" started-at="2012-10-02T21:05:57Z" finished-at="2012-10-02T21:05:57Z">
- <params>
+ <param index="0">
- <value>
- <![CDATA[ *iexplore
]]>
</value>
</param>
- <param index="1">
- <value>
- <![CDATA[ 4444
]]>
</value>
</param>
- <param index="2">
- <value>
- <![CDATA[ http://www.google.ru
]]>
</value>
</param>
</params>
- <exception class="java.lang.NoClassDefFoundError">
- <message>
- <![CDATA[ com/google/common/base/Charsets
]]>
</message>
- <full-stacktrace>
- <![CDATA[
java.lang.NoClassDefFoundError: com/google/common/base/Charsets
at com.thoughtworks.selenium.HttpCommandProcessor.getOutputStreamWriter(HttpCommandProcessor.java:149)
at com.thoughtworks.selenium.HttpCommandProcessor.getCommandResponseAsString(HttpCommandProcessor.java:176)
at com.thoughtworks.selenium.HttpCommandProcessor.executeCommandOnServlet(HttpCommandProcessor.java:118)
at com.thoughtworks.selenium.HttpCommandProcessor.doCommand(HttpCommandProcessor.java:101)
at com.thoughtworks.selenium.HttpCommandProcessor.getString(HttpCommandProcessor.java:275)
at com.thoughtworks.selenium.HttpCommandProcessor.start(HttpCommandProcessor.java:237)
at com.thoughtworks.selenium.DefaultSelenium.start(DefaultSelenium.java:100)
at com.example.tests.testBase.setUp(testBase.java:26)
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 org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:80)
at org.testng.internal.Invoker.invokeConfigurationMethod(Invoker.java:564)
at org.testng.internal.Invoker.invokeConfigurations(Invoker.java:213)
at org.testng.internal.Invoker.invokeConfigurations(Invoker.java:138)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:277)
at org.testng.SuiteRunner.run(SuiteRunner.java:240)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:51)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:85)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1197)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1122)
at org.testng.TestNG.run(TestNG.java:1030)
at org.testng.TestNG.privateMain(TestNG.java:1337)
at org.testng.TestNG.main(TestNG.java:1306)
Caused by: java.lang.ClassNotFoundException: com.google.common.base.Charsets
at java.net.URLClassLoader$1.run(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 25 more


]]>
</full-stacktrace>
</exception>
- <!-- java.lang.NoClassDefFoundError
-->
<reporter-output />
</test-method>
- <!-- setUp
-->
- <test-method status="SKIP" signature="testAddNewGroup()[pri:0, instance:com.example.tests.addNewAccount@1557ee8]" name="testAddNewGroup" duration-ms="0" started-at="2012-10-02T21:05:57Z" finished-at="2012-10-02T21:05:57Z">
<reporter-output />
</test-method>
- <!-- testAddNewGroup
-->
- <test-method status="SKIP" signature="tearDown()[pri:0, instance:com.example.tests.addNewAccount@1557ee8]" name="tearDown" is-config="true" duration-ms="0" started-at="2012-10-02T21:05:57Z" finished-at="2012-10-02T21:05:57Z">
<reporter-output />
</test-method>
- <!-- tearDown
-->
</class>
- <!-- com.example.tests.addNewAccount
-->
</test>
- <!-- Default test
-->
</suite>
- <!-- Default suite
-->
</testng-results>
  • 0

#13 appmen

appmen

    Опытный участник

  • Members
  • PipPipPipPip
  • 408 сообщений
  • ФИО:Victor

Отправлено 02 октября 2012 - 15:15

я могу предложить вариант, но это тоже будет через жопу. Я использовал класс ТестРанер или как-то так. Писал тесты на РС, создавал файл
class HelloWorld {
	public static void main(String[] args) {
		Запустить.Тест(МойТест.class)
	}
	}
всё это компилировал и получал выполняемый файл, который запускал тест(ы) по щелчку мышки (просто выполняемый файл). Строчка String[] args читает командную строку, разделяет по слову и записывает в масив args. Достать переменные из масива не проблема, потом можно присвоить каждый элемент масива переменной как у вас и передать их в setUp()

если заинтересовало - выложу код завтра\послезавтра
  • 0

#14 gausner

gausner

    Новый участник

  • Members
  • Pip
  • 9 сообщений


Отправлено 03 октября 2012 - 05:00

я могу предложить вариант, но это тоже будет через жопу. Я использовал класс ТестРанер или как-то так. Писал тесты на РС, создавал файл

class HelloWorld {
	public static void main(String[] args) {
		Запустить.Тест(МойТест.class)
	}
	}
всё это компилировал и получал выполняемый файл, который запускал тест(ы) по щелчку мышки (просто выполняемый файл). Строчка String[] args читает командную строку, разделяет по слову и записывает в масив args. Достать переменные из масива не проблема, потом можно присвоить каждый элемент масива переменной как у вас и передать их в setUp()

если заинтересовало - выложу код завтра\послезавтра


Да, спасибо, я был бы очень признательным за код )
  • 0


Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 анонимных