Browse the Knowledge Hub211 resources
UFT One review: what it is, tutorial and pricing
UFT One, formerly QuickTest Professional and now sold by OpenText as OpenText Functional Testing, is a commercial Windows tool for automating GUI and API tests. Add-ins teach it to recognise objects in web, SAP, Java, .NET, Oracle, terminal emulator and other technologies, tests are written in VBScript or, from 26.1, Python in beta, and an object repository holds how each object is identified.
QAble runs this tool on client engagements. The assessment below is from that experience.
- last reviewed
- 13 October 2026
- version covered
- OpenText Functional Testing (UFT One) 26.3
- licence
- Commercial
At a glance
UFT One at a glance
- Vendor
- OpenText
- Category
- Desktop automation, Web automation
- Licence
- Commercial
- Platforms
- Windows
- Languages
- VBScript, Python (beta)
- Integrates with
- OpenText ALM, Jenkins, Azure DevOps, GitHub Actions, OpenText Functional Testing Lab
- First released
- 1998
- Version reviewed
- OpenText Functional Testing (UFT One) 26.3
Verdict
Our verdict on UFT One
Strengths
- One tool for web, SAP GUI, Java, .NET, Oracle, PowerBuilder, terminal emulators and more, through add-ins
- The object repository separates identification from test logic, so a changed control is fixed once
- Recording, keyword view and checkpoints let non-programmers build first tests quickly
- AI-based steps find controls visually by type and label in browsers, mobile and SAP GUI
- Official integrations with ALM, Jenkins, Azure DevOps and a GitHub Action for CI runs
Weaknesses
- Commercial, quote-only pricing; concurrent licences cap how many tests run at once
- Windows only, and GUI runs need a live Windows session rather than a headless agent
- Object repositories are binary files that Git cannot merge
- VBScript is deprecated in Windows; Python support is only in beta
- The talent pool and community are far smaller than for Selenium or Playwright
Best for
Enterprise estates where the applications under test are not just browsers: SAP GUI, Java and .NET thick clients, Oracle Forms, PowerBuilder, terminal emulators and the web front ends that sit beside them. One tool, one object model and one reporting format across those technologies is what UFT still does better than open-source stacks, and in our experience it is often the only practical option for the mainframe and thick-client parts rather than the preferred one. Teams already on OpenText ALM also gain test management and lab integration.
Not for
Web-only or mobile-first products. Playwright and Selenium cover browsers with code in mainstream languages, run headless on any CI agent and cost nothing in licences, so choosing UFT for a new web application is very hard to justify. It is also a poor fit for teams that want tests reviewed as code in pull requests, because object repositories are binary files that Git stores but cannot merge.
Setup cost
Moderate, gated by licensing and add-ins. Installation is a Windows setup with a licence from a seat key or a concurrent AutoPass License Server. The add-ins loaded at start-up decide which objects UFT recognises, and loading the wrong set is the classic first-day problem: everything appears as a generic window. A useful framework, with shared repositories, function libraries and data tables, takes weeks to design before coverage grows quickly.
Maintenance burden
High unless the suite was designed past recording. Recorded tests duplicate objects into local repositories, and a UI change then has to be fixed in many places. Shared repositories, descriptive programming for dynamic objects and function libraries keep it manageable. Version control works for scripts, but repositories need ownership rules and OpenText’s merge tool rather than Git merges. Each Windows, browser and application upgrade also needs checking against the support matrix.
Honest limitations
Windows only, and GUI tests need a Windows user session: they can run on a locked or disconnected remote machine with the right option set, but not on one that is logged off. The Docker images run only headless Chrome web tests and API tests, with concurrent licences. Concurrent licences cap parallelism whatever hardware you add. And VBScript, the main test language, is deprecated by Microsoft in Windows, which makes the new Python support worth watching closely.
How it works
What is UFT One and how does it work?
Add-ins decide what UFT can see
UFT recognises objects through add-ins, each of which understands one technology: Web, Java, .NET, SAP Solutions, Oracle, PowerBuilder, Siebel, Terminal Emulator, UI Automation and others. The Add-in Manager chooses which load when UFT starts, and a test records which add-ins it needs. With the right add-in, a SAP grid or a Java table is a typed object with meaningful methods; without it, the same control is a generic window that only accepts coordinates. Most first-day failures, and many after a technology upgrade, trace back to add-in loading or a version the support matrix does not cover.
Test objects and the object repository
UFT separates how an object is identified from what the test does with it. Each test object has a class, such as WebEdit or SAPGuiButton, and a description: a few property values, by default the mandatory properties for its class, plus assistive properties and an ordinal identifier when needed to tell similar objects apart. Descriptions live in an object repository. Each action has a local repository, and shared repositories, stored as .tsr files, can be associated with many actions, so a changed button is fixed once. Repositories are managed through the Object Repository Manager and merged with OpenText’s merge tool, because they are not text files.
Actions, data tables and function libraries
A GUI test is a folder of actions, each a VBScript script with its own local repository and data sheet. The data table, a spreadsheet with a global sheet and one per action, drives iterations, so the same steps run once per row. Function libraries hold reusable VBScript functions associated with a test, and recovery scenarios handle unexpected pop-ups. Checkpoints compare object properties, text, bitmaps or databases against expected values. The structure rewards design: tests built from small reusable actions and libraries stay maintainable, while recorded monoliths do not.
Runs need a Windows session and a licence
UFT drives applications through Windows itself, so a GUI test needs a real user session with a desktop. A run options setting lets tests execute on a remote machine whose session is locked or disconnected, but logging off is not supported, and a local machine that locks during a run can fail it. Every running instance also holds a licence. Those two facts shape execution: dedicated Windows machines or virtual machines, kept signed in, with parallelism bounded by concurrent licences. ParallelRunner, a command-line tool, runs web tests across browsers and mobile tests on lab devices in parallel, each run consuming a licence.
Strengths
What it does well
Reach into enterprise technologies
The add-in list is the reason UFT is still bought: SAP Solutions, Oracle, PeopleSoft, Siebel, PowerBuilder, Delphi, Qt, Stingray, VisualAge Smalltalk, terminal emulators, Java, .NET and the web, plus UI Automation for modern Windows apps. An end-to-end business process that crosses a SAP screen, a terminal session and a web portal can be one test with one report.
AI-based object recognition
AIUtil steps find controls visually by type and label, such as an input labelled Username or a button labelled Log In, after a context is set to a browser, a mobile device or a SAP GUI session. They help where technical properties are unstable or unavailable. The enhanced UIA Pro add-in became fully supported and on by default in 26.1.
GUI and API tests in one tool
Alongside GUI tests, UFT builds API tests from a visual activity canvas, covering REST and SOAP calls and Docker activities, and the two can be combined in one business flow. That lets a team set up data through a service and verify the result in a thick client without a second framework.
ALM and lab integration
Tests, function libraries and repositories can be stored in OpenText ALM, run from ALM test sets or ALM Lab Management, and reported back with full results. For organisations that already govern testing through ALM, that traceability from requirement to run is a large part of UFT’s value.
Containers for web and API runs
OpenText publishes Windows Docker images with Functional Testing installed, which run web and AI-based web tests in headless Chrome and API tests, and a Linux image that runs API tests as a technical preview. They need concurrent licences, but they let part of a suite run on disposable infrastructure.
Generative AI and Python in the 26.x line
Version 26.1 added Python as a beta language for tests, alongside VBScript. From 26.3 the licence wizard offers a UFT Aviator add-on for generative AI features, which works only with a concurrent product licence. Both signal where OpenText is taking the product, and both are worth piloting before relying on them.
Pricing
UFT One pricing and licensing
UFT One is commercial software sold by OpenText as OpenText Functional Testing. OpenText does not publish prices; purchases go through its sales team or partners, and a free trial can be requested from the product page. Licences are either seat licences, locked to one machine, or concurrent licences served by an AutoPass License Server, and every running instance consumes one. Budget also for Windows machines, ALM if you use it, and specialist skills.
- Licence types: seat, tied to one machine’s locking code, or concurrent, drawn per session from an AutoPass License Server. Concurrent licences can be checked out as commuter licences for up to 365 days.
- Editions in the licence wizard: OpenText Functional Testing (UFT One), the Runtime Engine and a standalone Functional Testing for Developers licence. UFT Ultimate is no longer sold.
- Add-ons: from 26.3, a concurrent UFT Aviator add-on licence enables generative AI features, and works only with a concurrent product licence.
- How cost scales: by licences, not machines. Parallel runs, Docker containers and CI agents each hold a licence while running, so concurrency is bought, not configured.
- Hidden costs: dedicated Windows machines kept signed in, OpenText ALM for test management if used, and engineers with VBScript and UFT framework experience, who are increasingly scarce.
Checked against the vendor’s own pages on 13 October 2026. Pricing changes; confirm on the official site before buying.
Getting started
UFT One tutorial: getting started
Setup, step by step
- Request a trial or obtain a licence, and check the support matrix for your Windows, browser and application versions.
- Run the installer as an administrator on Windows and select the add-ins for the technologies you test.
- Install a seat licence, or point UFT at your AutoPass License Server for a concurrent one.
- Start UFT, tick only the add-ins this test needs in the Add-in Manager, and create a GUI test.
- Record a short flow or write the steps, then replace recorded values with data table parameters.
- Run the test and read the run results, which show each step, screenshots and checkpoint outcomes.
Install
Download OpenText Functional Testing from OpenText (trial or licensed)
Run setup as administrator on Windows and select the required add-ins
Install a licence with the License Wizard: seat key, or concurrent from an AutoPass License Server (default port 5814)A first example
' Action1 of a GUI test, with the Web Add-in loaded
' Email and Password columns live in the Global data table sheet
SystemUtil.Run "chrome.exe", "https://shop.example.com/login"
' Descriptive programming: properties and regular expressions instead of a repository
Set page = Browser("creationtime:=0").Page("title:=.*Sign in.*")
page.WebEdit("name:=email").Set DataTable("Email", dtGlobalSheet)
page.WebEdit("name:=password").SetSecure DataTable("Password", dtGlobalSheet) ' encrypted value
page.WebButton("name:=Sign in").Click
' Exist waits up to 10 seconds for the object before returning False
Set heading = Browser("creationtime:=0").Page("title:=.*Dashboard.*").WebElement("html tag:=H1", "innertext:=Welcome back.*")
If heading.Exist(10) Then
Reporter.ReportEvent micPass, "Sign in", "Dashboard shown"
Else
Reporter.ReportEvent micFail, "Sign in", "Dashboard not shown"
End IfWhat trips people up first
Objects that record as WinObject or are not recognised at all. That almost always means the add-in for the technology was not loaded when UFT started, the application was already open before UFT, or the browser extension was not enabled. Close everything, open the Add-in Manager, select the right add-ins, start UFT first and then the application, and use Object Spy to confirm that controls show their proper class, such as WebEdit or SAPGuiTextField. The second hurdle is recorded tests that pass once and fail later because recorded descriptions included values that change, such as dynamic titles or generated ids.
In practice
Using UFT One in practice
Designing repositories and libraries
Structure decides whether a UFT suite survives. Keep one shared object repository per application area, associate it with the actions that need it, and keep local repositories empty or close to it. Put business steps such as signing in or creating an order in function libraries, so tests read as sequences of business actions. Use descriptive programming, Description.Create and ChildObjects for objects whose properties change at run time, such as table rows, and keep descriptions minimal: two or three stable properties with regular expressions where needed. Give each shared repository an owner, because concurrent edits to a binary file are resolved only through the merge tool.
' Common.qfl: a function library associated with the test
Function SignIn(email, password)
' Browser("Shop") and its pages come from the shared repository
With Browser("Shop").Page("Sign in")
.WebEdit("Email").Set email
.WebEdit("Password").SetSecure password
.WebButton("Sign in").Click
End With
SignIn = Browser("Shop").Page("Dashboard").Exist(15)
End Function
Function CountOrderRows()
' Rows are generated, so describe them at run time
Set rowDesc = Description.Create()
rowDesc("micclass").Value = "WebElement"
rowDesc("class").Value = "order-row.*"
Set rows = Browser("Shop").Page("Orders").ChildObjects(rowDesc)
CountOrderRows = rows.Count
End FunctionData-driven runs without copy and paste
Replace recorded literals with data table parameters as soon as a test works once. The global sheet drives test iterations; each action sheet can drive action iterations, so a login action can run once while an order-entry action runs for every row. Import sheets from Excel for business-owned data, and keep secrets out of the table by encrypting them with the Password Encoder and using SetSecure. For values that differ by environment, such as URLs or credentials, use environment variables loaded from an XML file per environment rather than editing tests. A suite organised this way can switch between test and staging with a single file.
Running from GitHub Actions and other CI
OpenText supports CI through its Application Automation Tools plugin for Jenkins, an Azure DevOps extension, a GitLab guide and the opentext/functional-testing GitHub Action. The action runs on a self-hosted Windows runner with UFT installed, downloads FTToolsLauncher, runs GUI and API tests stored in the repository, or ALM test sets, and archives the results. Test paths must be relative to the repository root, and parameterised file-system runs go through an MTBX file. The runner service must run in a signed-in Windows session for GUI tests. For other CI servers, the same FTToolsLauncher utilities run tests from the command line and convert reports to JUnit XML.
# .github/workflows/uft-regression.yml
name: uft-regression
on:
workflow_dispatch:
schedule:
- cron: '0 2 * * 1-5' # nightly on weekdays
permissions:
contents: read
jobs:
uft:
# Self-hosted Windows machine with OpenText Functional Testing installed
runs-on: [self-hosted, windows]
steps:
- name: Run UFT tests
uses: opentext/[email protected]
with:
runType: filesystem
# Relative to the repository root; an .mtbx file can list tests with parameters
testPaths: tests\regression.mtbx
githubToken: ${{ secrets.GITHUB_TOKEN }}
timeout: 7200
failIfNotPassed: trueParallel runs, containers and licences
Scale is a licensing question first. ParallelRunner, in the installation’s bin folder, runs web tests across several browsers and mobile tests on lab devices at once, but UFT itself must be closed while it runs and each run holds a licence. The Docker images move headless Chrome web tests and API tests onto containers that can be created per run, again with concurrent licences only; desktop technologies such as SAP GUI or terminal emulators still need full Windows machines. In our experience the practical pattern is a small pool of Windows virtual machines, kept signed in, each with one concurrent licence and a CI agent, with long suites split by business area across the pool.
AI steps, Python and the VBScript question
AI-based steps are useful where object properties are poor, for example canvas-drawn controls or applications that regenerate ids. Set the context once, then address controls by type and visible label; keep them for those screens rather than replacing a working repository. Treat the 26.x additions as a roadmap to pilot. Python is in beta as a test language, and Microsoft lists VBScript as deprecated in Windows, to become a feature on demand before removal. We found no OpenText statement on how that affects future UFT versions, so check the support matrix before each Windows upgrade and keep new framework code in small, well-named functions that could be ported.
' AI-based steps against a browser context
AIUtil.SetContext Browser("creationtime:=0")
AIUtil("input", "Username").Type "[email protected]"
AIUtil("input", "Password").Type "correct-horse"
AIUtil("button", "Log In").Click
' Text blocks are found visually, so this works on canvas-drawn UIs too
AIUtil.FindTextBlock("Welcome back").CheckExists TruePitfalls
Common pitfalls
Objects recorded as WinObject or not recognised
Why it happens: The add-in for the technology was not loaded, the application started before UFT, or the browser extension was disabled, so UFT sees only generic windows.
The fix: Load the right add-ins in the Add-in Manager, start UFT before the application, enable the browser extension, and confirm classes with Object Spy before recording.
A recorded suite where every test has its own copy of each object
Why it happens: Recording writes objects into each action’s local repository, so one UI change must be fixed in dozens of places.
The fix: Move objects into shared repositories with the Object Repository Manager, associate them with actions, and put business steps in function libraries.
Two people editing the same shared repository
Why it happens: A .tsr file is binary, so Git can store both versions but cannot merge them, and one person’s work is silently lost.
The fix: Assign repository ownership, split repositories by application area, and reconcile changes with the Object Repository Merge Tool. Export to XML when a change needs review.
Fixed Wait statements for synchronisation
Why it happens: Wait 10 always costs ten seconds and still fails when the system is slower than expected, so suites become both slow and flaky.
The fix: Synchronise on state: Exist with a timeout, WaitProperty for a property value, or the page’s Sync method for browser navigation.
Nightly runs fail on a machine nobody is logged into
Why it happens: GUI tests need a Windows session. Running on a locked or disconnected remote session is supported with the right option, but a logged-off machine is not.
The fix: Enable testing on locked or disconnected remote computers in the run session options, disconnect rather than log off, and use virtual machines without a lock screen for local runs.
Expecting Docker to replace the Windows lab
Why it happens: The Docker images run only headless Chrome web tests and API tests, with concurrent licences, and the Linux image is an API technical preview.
The fix: Containerise web and API suites where it helps, and keep full Windows machines for SAP GUI, terminal emulator, Java and .NET desktop tests.
Compared
How UFT One compares
| Tool | Authoring | Test languages | Technology reach | Where tests run | Licence |
|---|---|---|---|---|---|
| UFT One | Record, keyword view and scripts | VBScript; Python in beta | Web, SAP, Java, .NET, Oracle, mainframe | Windows; Docker for web and API | Commercial, seat or concurrent |
| Tricentis Tosca | Model-based, scriptless Modules and TestCases | None required | Web, SAP, Salesforce, desktop, API, mainframe | Windows agents; Tosca Cloud execution | Commercial, floating licences or SaaS |
| Selenium | Code against WebDriver bindings | Java, Python, C#, Ruby, JavaScript | Browsers only | Any OS, headless or Grid | Apache 2.0 |
| Playwright | Code with built-in test runner | JS, TS, Python, Java, C# | Chromium, Firefox and WebKit browsers | Any OS, headless by default | Apache 2.0 |
FAQ
Frequently asked questions
What is UFT One?
UFT One, formerly QuickTest Professional and now sold by OpenText as OpenText Functional Testing, is a commercial Windows tool for automating GUI and API tests. Add-ins teach it to recognise objects in web, SAP, Java, .NET, Oracle, terminal emulator and other technologies, tests are written in VBScript or, from 26.1, Python in beta, and an object repository holds how each object is identified.
Is UFT One free?
No. UFT One is commercial software from OpenText, sold as OpenText Functional Testing, and OpenText does not publish prices; you buy through its sales team or partners. A free trial can be requested from the product page. Licences are seat licences tied to a machine or concurrent licences served from an AutoPass License Server, and every running instance holds one.
Is UFT One the same as OpenText Functional Testing?
Yes. The product has been QuickTest Professional, HP UFT, Micro Focus UFT One and now OpenText Functional Testing, and OpenText’s help pages and GitHub Action still use UFT One in places. Versions follow a year-based scheme, with the 26.1 to 26.3 releases current on the review date. OpenText Functional Testing for Developers, formerly UFT Developer and LeanFT, is a separate code-first product for Java and C# in Visual Studio or Eclipse.
Should I choose UFT One or Selenium?
For web applications alone, Selenium or Playwright: free, code-based, runnable on any CI agent and supported by a much larger community. Choose UFT One when the scope includes SAP GUI, Java or .NET thick clients, Oracle Forms, terminal emulators or other technologies its add-ins cover, and you want one tool and one report across them, or when your organisation already runs testing through OpenText ALM.
Can UFT One run in CI or headless?
Yes, with limits. The Jenkins plugin, Azure DevOps extension and GitHub Action run tests on Windows machines with UFT installed, and command-line utilities convert results to JUnit XML. GUI tests need a Windows session, which can be locked or disconnected but not logged off. True headless runs are limited to headless Chrome web tests and API tests, including in OpenText’s Docker images.
Does UFT One support Python?
Partly. Version 26.1 added Python as a beta language for writing tests, alongside VBScript, with a Python engine installed when a supported Python version is present. Treat it as a pilot rather than a migration target until it leaves beta. Existing VBScript tests, function libraries and recovery scenarios are not converted automatically.
Will Microsoft’s VBScript deprecation break UFT One?
Microsoft lists VBScript as deprecated in Windows, announced in October 2023, and says it will be available as a feature on demand before its removal from the operating system. We found no OpenText statement on the effect on UFT One. Check each release’s support matrix before upgrading Windows on test machines, and watch the Python beta, which is the obvious long-term route.
Is UFT One worth learning in 2026?
Worth it if you work in, or want to work in, enterprises with SAP, mainframe or thick-client estates, where UFT suites will need maintaining for years and experienced engineers are scarce. For a general automation career, learn Playwright or Selenium first, since the web dominates new work and the skills transfer across far more employers.
Alternatives
UFT One alternatives worth weighing
Selenium
Open-source browser automation built on the W3C WebDriver standard, with official bindings for Java, Python, C#, Ruby and JavaScript.
Playwright
Microsoft browser automation with auto-waiting, network interception and parallel execution built in.
Tricentis Tosca
Model-based, codeless test automation for enterprise applications such as SAP, Salesforce and Oracle, offered as Windows-based Tosca Commander and as SaaS Tosca Cloud.
Resources
Where to go next
Keep going
Prepare, or get it done
Picking the wrong tool costs more than picking late.
QAble advises on toolchain decisions and then implements them, with engineers who have run these tools on real delivery. Start with a free QA audit.