Python скрипты в TestComplete
Введение | |
Похожие статьи |
Введение
Использование внешних библиотек
У TestComplete серьёзные проблемы с адаптацией внешних библиотек.
Всё настолько плохо, что они прямо в
документации
пишут что не гарантируют работу вообще никаких дополнительных библиотек, кроме тех что есть в их
версии Python.
We do not guarantee stable work of your script tests that use third-party Python packages. When you run such tests, you may experience unexpected errors or TestComplete can stop responding.
А что такое third-party Pyhon packages? Правильно, это всё, что мы ставим с помощью
pip
.
То есть скрипты на Python писать можно, но с дополнительными инструментами, без которых сложно представить работу питониста - всё на свой страх и риск.
Всё, что доступно из коробки лежит в Lib.
Обратите внимание на то, что есть 32-х битная версия
/c/Program Files (x86)/SmartBear/TestComplete 15/Bin/Extensions/Python/Python310/Lib
ls
__future__.py asynchat.py contextlib.py filecmp.py imp.py nturl2path.py pyclbr.py sndhdr.py test/ warnings.py __phello__.foo.py asyncio/ contextvars.py fileinput.py importlib/ numbers.py pydoc.py* socket.py textwrap.py wave.py _aix_support.py asyncore.py copy.py fnmatch.py inspect.py opcode.py pydoc_data/ socketserver.py this.py weakref.py _bootsubprocess.py base64.py* copyreg.py fractions.py io.py operator.py queue.py sqlite3/ threading.py webbrowser.py* _collections_abc.py bdb.py cProfile.py* ftplib.py ipaddress.py optparse.py quopri.py* sre_compile.py timeit.py* wsgiref/ _compat_pickle.py binhex.py crypt.py functools.py json/ os.py random.py sre_constants.py tkinter/ xdrlib.py _compression.py bisect.py csv.py genericpath.py keyword.py pathlib.py re.py sre_parse.py token.py xml/ _markupbase.py bz2.py ctypes/ getopt.py lib2to3/ pdb.py* reprlib.py ssl.py tokenize.py xmlrpc/ _osx_support.py calendar.py curses/ getpass.py linecache.py pickle.py rlcompleter.py stat.py trace.py* zipapp.py _py_abc.py cgi.py* dataclasses.py gettext.py locale.py pickletools.py runpy.py statistics.py traceback.py zipfile.py _pydecimal.py cgitb.py datetime.py glob.py logging/ pipes.py sched.py string.py tracemalloc.py zipimport.py _pyio.py chunk.py dbm/ graphlib.py lzma.py pkgutil.py secrets.py stringprep.py tty.py zoneinfo/ _sitebuiltins.py cmd.py decimal.py gzip.py mailbox.py platform.py* selectors.py struct.py turtle.py _strptime.py code.py difflib.py hashlib.py mailcap.py plistlib.py shelve.py subprocess.py turtledemo/ _threading_local.py codecs.py dis.py heapq.py mimetypes.py poplib.py shlex.py sunau.py types.py _weakrefset.py codeop.py distutils/ hmac.py modulefinder.py posixpath.py shutil.py symtable.py typing.py abc.py collections/ doctest.py html/ msilib/ pprint.py signal.py sysconfig.py unittest/ aifc.py colorsys.py email/ http/ multiprocessing/ profile.py* site.py tabnanny.py* urllib/ antigravity.py compileall.py encodings/ idlelib/ netrc.py pstats.py site-packages/ tarfile.py* uu.py* argparse.py concurrent/ ensurepip/ imaplib.py nntplib.py pty.py smtpd.py* telnetlib.py uuid.py ast.py configparser.py enum.py imghdr.py ntpath.py py_compile.py smtplib.py* tempfile.py venv/
И 64-х битная
pwd
/c/Program Files (x86)/SmartBear/TestComplete 15/x64/Bin/Extensions/Python/Python310
ls
__future__.py antigravity.py collections/ dis.py gzip.py logging/ pickle.py random.py sqlite3/ textwrap.py venv/ __phello__.foo.py argparse.py colorsys.py distutils/ hashlib.py lzma.py pickletools.py re.py sre_compile.py this.py warnings.py __pycache__/ ast.py compileall.py doctest.py heapq.py mailbox.py pipes.py reprlib.py sre_constants.py threading.py wave.py _aix_support.py asynchat.py concurrent/ email/ hmac.py mailcap.py pkgutil.py rlcompleter.py sre_parse.py timeit.py* weakref.py _bootsubprocess.py asyncio/ configparser.py encodings/ html/ mimetypes.py platform.py* runpy.py ssl.py tkinter/ webbrowser.py* _collections_abc.py asyncore.py contextlib.py ensurepip/ http/ modulefinder.py plistlib.py sched.py stat.py token.py wsgiref/ _compat_pickle.py base64.py* contextvars.py enum.py idlelib/ msilib/ poplib.py secrets.py statistics.py tokenize.py xdrlib.py _compression.py bdb.py copy.py filecmp.py imaplib.py multiprocessing/ posixpath.py selectors.py string.py trace.py* xml/ _markupbase.py binhex.py copyreg.py fileinput.py imghdr.py netrc.py pprint.py shelve.py stringprep.py traceback.py xmlrpc/ _osx_support.py bisect.py cProfile.py* fnmatch.py imp.py nntplib.py profile.py* shlex.py struct.py tracemalloc.py zipapp.py _py_abc.py bz2.py crypt.py fractions.py importlib/ ntpath.py pstats.py shutil.py subprocess.py tty.py zipfile.py _pydecimal.py calendar.py csv.py ftplib.py inspect.py nturl2path.py psycopg2/ signal.py sunau.py turtle.py zipimport.py _pyio.py cgi.py* ctypes/ functools.py io.py numbers.py pty.py site.py symtable.py turtledemo/ zoneinfo/ _sitebuiltins.py cgitb.py curses/ genericpath.py ipaddress.py opcode.py py_compile.py site-packages/ sysconfig.py types.py _strptime.py chunk.py dataclasses.py getopt.py json/ operator.py pyclbr.py smtpd.py* tabnanny.py* typing.py _threading_local.py cmd.py datetime.py getpass.py keyword.py optparse.py pydoc.py* smtplib.py* tarfile.py* unittest/ _weakrefset.py code.py dbm/ gettext.py lib2to3/ os.py pydoc_data/ sndhdr.py telnetlib.py urllib/ abc.py codecs.py decimal.py glob.py linecache.py pathlib.py queue.py socket.py tempfile.py uu.py*
Директорию psycopg2/ я добавил вручную.
$ ./python.exe -m pip install --upgrade pip
Requirement already satisfied: pip in c:\program files (x86)\smartbear\testcomplete 15\bin\extensions\python\python310\lib\site-packages (22.3.1) Collecting pip Downloading pip-23.3.1-py3-none-any.whl (2.1 MB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.1/2.1 MB 12.2 MB/s eta 0:00:00 Installing collected packages: pip Attempting uninstall: pip Found existing installation: pip 22.3.1 Uninstalling pip-22.3.1: Successfully uninstalled pip-22.3.1 WARNING: The scripts pip.exe, pip3.10.exe and pip3.exe are installed in 'C:\Program Files (x86)\SmartBear\TestComplete 15\Bin\Extensions\Python\Python310\Scripts' which is not on PATH. Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location. Successfully installed pip-23.3.1
В моём Python 3.11 psycopg2 установлен через python -m pip install psycopg2
Там psycopg2 импортируется без каких-либо хитростей.
import psycopg2 …
python pg_utils.py
В TestComplete сейчас Python 3.10 поэтому я скачиваю последнюю версию psycopg2 из их
GitHub
репозитория
(
ссылка
)
в виде .zip файла
Распаковываю сперва в
C:\Users\Andrei\AppData\Local\Programs\Python\Python310\Lib\site-packages
А потом то же самое буду делать в
/c/Program Files (x86)/SmartBear/TestComplete 15/x64/Bin/Extensions/Python/Python310
В Git Bash перехожу в директорию со скриптом setup.py
/c/Users/Andrei/AppData/Local/Programs/Python/Python310/python.exe setup.py build
/c/Users/Andrei/AppData/Local/Programs/Python/Python310/python.exe setup.py install
И потом ещё до кучи ставлю psycopg2-binary
/c/Users/Andrei/AppData/Local/Programs/Python/Python310/python.exe -m pip install psycopg2-binary
from os import sys psycopg2_location = "C:\Users\Andrei\AppData\Local\Programs\Python\Python310\Lib\site-packages" sys.path.insert(0, psycopg2_location) import psycopg2 …
/c/Users/Andrei/AppData/Local/Programs/Python/Python310/python.exe pg_utils.py
Этот метод работает. Делаю то же самое но в директории TestComplete
from os import sys psycopg2_location = "psycopg2_location = "C:\Program Files (x86)\SmartBear\TestComplete 15\Bin\Extensions\Python\Python310\Lib\site-packages" sys.path.insert(0, psycopg2_location) import psycopg2 …
/c/Program\ Files\ \(x86\)/SmartBear/TestComplete\ 15/Bin/Extensions/Python/Python310/python.exe pg_utils.py
Чтобы прочитать из базы данных
Postgres
пришлось делать манипуляции с
системным путём
.
Подробнее про подключение к Postgres из Python читайте в статье
Python + Postgres
from os import sys mode = "py" # Normal Python: system or from venv mode = "tc_py" # TestComplete native Python mode = "tc" # TestComplete GUI if mode == "tc": print = Log.Message if mode in ["tc", "tc_py"]: tc_py_path = "C:\Program Files (x86)\SmartBear\TestComplete 15\x64\Bin\Extensions\Python\Python310" psycopg2_path = tc_py_path + "\Lib\site-packages" print(f"original sys.path: {sys.path}") typing_extension_path = tc_py_path + "\lib\site-packages\typing_extensions-4.8.0-py3.10.egg" tz_data_path = tc_py_path + "\lib\site-packages\tzdata-2023.3-py3.10.egg" zip_path = tc_py_path + "\python310.zip" # sys.path.insert(0, psycopg2_path) # sys.path.insert(0, typing_extension_path) # sys.path.insert(0, tz_data_path) # sys.path.insert(0, zip_path) sys.path = [ psycopg2_path, 'C:\Tests\TestComplete\lib\postgres', zip_path, 'C:\Program Files (x86)\SmartBear\TestComplete 15\x64\Bin\Extensions\Python\Python310\DLLs', 'C:\Program Files (x86)\SmartBear\TestComplete 15\x64\Bin\Extensions\Python\Python310\lib', tc_py_path, tz_data_path, typing_extension_path ] else: print("Executing outside of TestComplete") # psycopg2_path = "C:\Users\" + os.getlogin() + "\AppData\Local\Programs\Python\Python310\Lib\site-packages" # print(psycopg2_path) print(f"sys.prefix: {sys.prefix}") print(f"sys.path: {sys.path}") import psycopg2 from config import credentials def connect(): """ Connect to the PostgreSQL database server """ print(f"connect: {'':-^140}") conn = None try: # read connection parameters params = credentials() print(params) # connect to the PostgreSQL server print('Connecting to the PostgreSQL database...') conn = psycopg2.connect(**params) # create a cursor cur = conn.cursor() # execute a statement # print('PostgreSQL database version:') # cur.execute('SELECT version()') # display the PostgreSQL database server version # db_version = cur.fetchone() # print(db_version) return cur except (Exception, psycopg2.DatabaseError) as error: print(f"Connection to DB failed with error: {error}") def main(): cur = connect() result = query(cur) cur = result[0] databases = result[1] print(f"databases: {databases}") db_list = [db[0] for db in databases] # for db in databases: # print(db) # print(type(db)) # db_list.append(db[0]) print(db_list) disconnect(cur) def query(cur): cur.execute("SELECT datname FROM pg_catalog.pg_database") databases = cur.fetchall() print(f"type(databases): {type(databases)}") print(f"query() databases: {databases}") result = (cur, databases) return result def disconnect(cur): # close the communication with the PostgreSQL print("closing connection to PostgreSQL") cur.close() def get_list_of_databases(): cur = connect() cur.execute("SELECT datname FROM pg_catalog.pg_database") databases = cur.fetchall() db_list = [db[0] for db in databases] cur.close() return db_list if __name__ == '__main__': print(get_list_of_databases())
Основы | |
Файлы | |
Тестирование калькулятора | |
Ошибки TestComplete | |
Тестирование | |
Автоматизация |