Что нового

Как перекрыть переменную?

vitaliy4us

Новичок
Сообщения
158
Репутация
4
1. Имеется отдельный au3 файл с константами и функциями, используемыми всеми тестами для автоматического тестирования.
2. В этом файле имеется глобальная переменная Global $log, указывающая на файл, в который все тесты пишут логи.
3. Но кроме того, тесты разбиты на suits. Каждый тестовый suit запускается из своего au3 файла, в котором создается с целью перекрытия глобальной переменной $log локальная переменная с тем же именем. Подразумевается, что теперь каждый suit будет писать в свой лог.
4. Но нет, логи упорно продолжают писаться в файл, обозначенный глобальной переменной.
5. OK. Меняю Global на Local и Local на Global - то же самое, как в принципе и в любой их комбинации. В любом случае, логи упорно пишутся в самый первый файл. А все оттого, что именно в нем прописана функция записи в лог. Если переменную $log убрать из этого файла совсем, то не будут запускаться каждый тест по отдельности, а только через suit. Как бы сделать так, чтобы при запуске из suit.au3 писалось в один файл, а при запуске каждого теста отдельно - в другой?
 
A

Alofa

Гость
vitaliy4us сказал(а):
... Меняю Global на Local и Local на Global - то же самое, как в принципе и в любой их комбинации.
Может просто переименуете Глобальную переменную или для каждого .au3 используйте свою.
Или изучите такие комбинации:
Код:
Global $log = 'Да'

_LogWrite1('Нет')
_LogWrite2('Еще Нет')
MsgBox(262144, 'В итоге:', $log)

Func _LogWrite1($log1)
	MsgBox(262144, 'Переменная передана в функцию:', $log1)
	MsgBox(262144, 'Глобальная переменная:', $log)
	Local $log = 'Я передумал'
	MsgBox(262144, 'Переменная объявлена в функции:', $log)
EndFunc

Func _LogWrite2($log)
    MsgBox(262144, '_LogWrite2()', $log)
EndFunc
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Переменные объявляются 1 раз, например Global $log = 'log.txt'
Любая функция может переписать значение, но не нужно заново объявлять, просто присваиваете $log = 'log_1.txt'
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
vitaliy4us
чтобы при запуске из suit.au3 писалось в один файл, а при запуске каждого теста отдельно - в другой
Я так и не понял, что есть "тест" - это функция или au3-скрипт? Если скрипт, то как вы его вызываете из suit?
 
Автор
V

vitaliy4us

Новичок
Сообщения
158
Репутация
4
InnI сказал(а):
vitaliy4us
чтобы при запуске из suit.au3 писалось в один файл, а при запуске каждого теста отдельно - в другой
Я так и не понял, что есть "тест" - это функция или au3-скрипт? Если скрипт, то как вы его вызываете из suit?
Да, тут собака и зарыта. Тест - это au3-скрипт. Запускаю функцией Run. Хотелось бы не создавать для него еще и параметры запуска, а потом использовать их в скрипте, а просто объявить переменную в скрипте suit, который представляет из себя просто набор функций Run для разных тестов, и чтобы эта переменная перекрыла значение глобальной переменной $log, которую каждый из скриптов импортирует вместе с файлом, в котором собраны все функции для всех скриптов.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
vitaliy4us
Запускаю функцией Run
В этом случае запущенный скрипт ничего не будет знать о переменных скрипта, его запустившего.
Хотелось бы не создавать для него еще и параметры запуска
При таком способе запуска всё равно придётся как-то сообщать скрипту, что он запущен из suit, а в самом скрипте делать проверку и, при необходимости, изменять путь.

Могу предложить такой вариант. Добавляете в самое начало общей UDF директиву
Код:
#include-once
Теперь подключаете UDF в suit перед тестами. Таким образом, все тесты будут писать в один лог, т.к. общая UDF в них уже подключаться не будет. А при запуске тестов отдельно, каждый будет вести свой отчёт
Код:
; содержимое suit
#include "common.au3" ; общая UDF с глобальной $log
#include "test1.au3"
ConsoleWrite("test1 выполнен")
#include "test2.au3"
ConsoleWrite("test2 выполнен")
#include "test3.au3"
ConsoleWrite("test3 выполнен")
 
Автор
V

vitaliy4us

Новичок
Сообщения
158
Репутация
4
InnI сказал(а):
vitaliy4us
Запускаю функцией Run
В этом случае запущенный скрипт ничего не будет знать о переменных скрипта, его запустившего.
Хотелось бы не создавать для него еще и параметры запуска
При таком способе запуска всё равно придётся как-то сообщать скрипту, что он запущен из suit, а в самом скрипте делать проверку и, при необходимости, изменять путь.

Могу предложить такой вариант. Добавляете в самое начало общей UDF директиву
Код:
#include-once
Теперь подключаете UDF в suit перед тестами. Таким образом, все тесты будут писать в один лог, т.к. общая UDF в них уже подключаться не будет. А при запуске тестов отдельно, каждый будет вести свой отчёт
Код:
; содержимое suit
#include "common.au3" ; общая UDF с глобальной $log
#include "test1.au3"
ConsoleWrite("test1 выполнен")
#include "test2.au3"
ConsoleWrite("test2 выполнен")
#include "test3.au3"
ConsoleWrite("test3 выполнен")
Спасибо, именно так работает как нужно.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
vitaliy4us

Предупреждение За нарушение общих правил (пункт В.2):
Старайтесь избегать “Over quoting” (преувеличенное цитирование) - цитируйте только необходимую часть сообщения, которая наилучшим образом подчеркнёт суть цитируемого.


С уважением, ваш Глобальный модератор.
 
Верх