View all services
Talk to QA Advisor
Browse the Knowledge Hub211 resources
/Tools Library/UFT One
Tools Library · We run this

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

Reviewed by Viral Patel

Co-Founder, QAbleLast reviewed 13 October 2026

At a glance

UFT One at a glance

Official site
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

  1. Request a trial or obtain a licence, and check the support matrix for your Windows, browser and application versions.
  2. Run the installer as an administrator on Windows and select the add-ins for the technologies you test.
  3. Install a seat licence, or point UFT at your AutoPass License Server for a concurrent one.
  4. Start UFT, tick only the add-ins this test needs in the Add-in Manager, and create a GUI test.
  5. Record a short flow or write the steps, then replace recorded values with data table parameters.
  6. 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 If

What 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 Function

Data-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: true

Parallel 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 True

Pitfalls

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

ToolAuthoringTest languagesTechnology reachWhere tests runLicence
UFT OneRecord, keyword view and scriptsVBScript; Python in betaWeb, SAP, Java, .NET, Oracle, mainframeWindows; Docker for web and APICommercial, seat or concurrent
Tricentis ToscaModel-based, scriptless Modules and TestCasesNone requiredWeb, SAP, Salesforce, desktop, API, mainframeWindows agents; Tosca Cloud executionCommercial, floating licences or SaaS
SeleniumCode against WebDriver bindingsJava, Python, C#, Ruby, JavaScriptBrowsers onlyAny OS, headless or GridApache 2.0
PlaywrightCode with built-in test runnerJS, TS, Python, Java, C#Chromium, Firefox and WebKit browsersAny OS, headless by defaultApache 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

Resources

Where to go next

Keep going

Prepare, or get it done

Ready

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.

Talk to QA Advisor