Core Data Types Of Silktest

  • October 2019
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View Core Data Types Of Silktest as PDF for free.

More details

  • Words: 7,753
  • Pages: 34
(¯`•._.•[Jagan’s]•._.•´¯) ************************************************************************ SILK TEST 7.5 ************************************************************************ The following topics are discussed in this document. 1. 2. 3. 4. 5. 6.

Types of TestCases Types of Testing Client/server testing challenges Networking protocols used by SilkTest Parallel processing statements and how they work Core Data Types in Silk Test

************************************************************************ 1. Types of testcases There are two basic types of testcases: •

Level 1 tests, often called smoke tests or object tests, verify that an application’s GUI objects function properly. For example, they verify that text fields can accept keystrokes and check boxes can display a check mark.



Level 2 tests verify an application feature. For example, they verify that an application’s searching capability can correctly find different types of search patterns.

You typically run Level 1 tests when you receive a new build of your application, and do not run Level 2 tests until your Level 1 tests achieve a specific pass/fail ratio. The reason for this is that unless your application’s graphical user interface works, you cannot actually test the application itself. ************************************************************************ 2. Types of Testing Functional testing Before you test the multi-user aspects of a client/server application, you should verify the functional operation of a single instance of the application. This is the same kind of testing that you would do for a non-distributed application. Once you have written scripts to test all the operations of the application as it runs on one platform, you can modify the scripts as needed for all other platforms on which the

(¯`•._.•[Jagan’s]•._.•´¯) application runs. Testing multiple platforms thus becomes almost trivial. Moreover, many of the tests you script for functional testing can become the basis of your other types of testing. For example, you can easily modify the functional tests (or a subset of them) to use in load testing. Configuration testing A client/server application typically runs on multiple different platforms and utilizes a server that runs on one or more different platforms. A complete testing program needs to verify that every possible client platform can operate with every possible server platform. This implies the following combinations of tests: •

Test the client application and the server application when they are running on the same machine—if that is a valid operational mode for the application. This testing must be repeated for each platform that can execute in that mode.



Test with the client and server on separate machines. This testing should be repeated for all different platform combinations of server and client

Concurrency testing Test two clients using the same server. This is a variation of functional testing that verifies that the server can properly handle simultaneous requests from two clients. The simplest form of concurrency testing just verifies that two clients can make multiple nonconflicting server requests during the same period of time. This is a very basic sanity test for a client/server application. To test for problems with concurrent access to the same database record, you need to write specific scripts that synchronize two clients to make requests of the same records in your server’s database(s) at the same time. Your goal is to encounter faulty read/write locks, software deadlocks, or other concurrency problems. Stress testing Stress testing verifies that running a particular command or set of commands a large number of times does not break the software. For example, stress testing discovers a failure to release resources. This is no different than stress testing for a non-distributed application, but as with functional testing, you need to discover whether the application functions properly with a remote server under stress conditions. You can do this type of stress testing with a single client. You can create stress tests by repeating the same commands a large number of times. Usually, the 4Test code looks like this: for i = 1 to 50 DoSomeCommands ()

(¯`•._.•[Jagan’s]•._.•´¯)

For example, you can stress-test remote logins or you can stress-test all application operations that allocate significant amounts of memory (to see if they release that memory). One simple form of stress testing is to set up your functional tests to repeat indefinitely and then run them night and day over a two- to four-day period. Load testing Load testing verifies that running a large number of concurrent clients does not break the server or client software. For example, load testing discovers deadlocks and problems with queues. SilkTest’s unique architecture provides built-in load testing. You can implement your functional tests using multi-application techniques and then, after completing functional testing on a single machine, you can run them on multiple targets. Unlike simulated load testing tools, SilkTest allows you to create a real-life scenario that can determine the actual impact of multi-machine operation on your application, the server, the network, and all related elements. There are two variations of load testing: 1. Peak load (sometimes called stress testing in the client/server environment) Peak load testing Peak load testing is placing a load on the server for a short time to emulate the heaviest demand that would be generated at peak user times—for example, credit card verification between noon and 1 PM on Christmas Eve. This type of test requires a significant number of client systems. If you submit complex transactions to the server from each client in your test network, using minimal user setup, you can emulate the typical load of a much larger number of clients. Your testbed may not have sufficient machines to place a heavy load on your server system — even if your clients are submitting requests at top speed. In this case it may be worthwhile to reconfigure your equipment so that your server is less powerful. An inadequate server configuration should enable you to test the server’s management of peak server conditions. 2. Volume Volume testing Volume testing is placing a heavy load on the server, with a high volume of data transfers, for 24 to 48 hours. One way to implement this is to use one set of clients to generate large amounts of new data and another set to verify the data (and delete data to keep the size of the database at an appropriate level). You would need to synchronize the verification scripts to wait for the generation scripts. The 4Test script language makes this easy. You would not normally need a very large testbed to drive this type of server load, but again, if you under-configure your

(¯`•._.•[Jagan’s]•._.•´¯) server you will probably be able to exercise the sections of the software that handle the outer limits of data capacity. Performance testing We believe that the most accurate determination of a system’ s performance is achieved by actually testing the system in a real-world environment, rather than through simulation. However, if it is impractical to test the full scope of the system (500 users, for instance), you will typically have a better understanding of the load on your system at this usage level by projecting the actual system performance based on the real-world testing of a subset of systems. Typically, the performance trend is reached long before all users have been added, and the mathematical projection is a simple one: Increase the rate of server requests submitted until the trend is isolated and then project the remainder. From the response times at different request rates, you can calculate the expected performance for different numbers of users submitting requests at a normal rate. The result of this method is frequently more accurate than simulation can provide, because a simulation cannot produce the same complex interactions as these scenarios. Although you probably cannot establish a 500-user testbed that runs a realistic workload (which might average two server requests per client per hour), you can design an artificial workload that submits sequential requests as fast as the response to the previous request is received. If you cannot generate a sufficient load using SilkTest’s GUI-driving scripts, use the Extension Kit (EK) to drive the application’s API directly. Using either method, you can drive the server with different rates of received requests and chart the response times for different numbers of representative users. You can then repeat the test with a more (or less) powerful server. See the Extension Kit Guide for more information. ************************************************************************ 3. Client/server testing challenges SilkTest provides powerful support for testing client/server applications and/ or databases in a networked environment. Testing multiple remote applications raises the level of complexity of QA engineering above that required for stand-alone application testing. Here are just a few of the testing methodology challenges raised by client/server testing: •

Managing simultaneous automatic regression tests on different configurations and/or platforms.



Ensuring the reproducibility of client/server tests that modify a server database.



Verifying the server operations of a client application’s independently, without relying on the application under test.



Testing the concurrency features of a client/server application.

(¯`•._.•[Jagan’s]•._.•´¯)



Testing the intercommunication capabilities of networked applications.



Closing down multiple failed applications and bringing them back to a particular base state (recovery control).



Testing the functioning of the server application when driven at peak request rates and at maximum data rates (peak load and volume testing).



Automated regression testing of multi-tier client/server architectures.

************************************************************************ 4. Networking protocols used by SilkTest SilkTest runs on many platforms, but only three different protocols are used. This means that a SilkTest script on one platform can drive the Agent on a target platform, as long as both the host and Agent platforms are running an appropriate protocol for the platform and both are running the same protocol (regardless of the protocols used by the applications under test). The table lists the protocols available for each platform. Platform Windows Solaris SunOS HP-UX AIX IRIX

TCP/IP • • • • • •

NetBIOS/ NetBEUI •

Suppose you are running SilkTest under Windows 95 and testing an application that requires TCP/IP communications in order to communicate with a server on a Sun Sparc station. SilkTest’s Windows machine can run NetBIOS for the host and the application’s Windows machine must then run NetBIOS for the Agent as well as TCP/IP for the application under test. Running NetBIOS will have no impact on your TCP/ IP connections but will allow SilkTest to communicate with the Agent. Alternatively, since the application is already running TCP/IP, you can choose to use TCP/IP for SilkTest and its Agents as well. There is no limit on the protocol or API that an application under test may use. Just make sure that the protocol required by SilkTest and the protocol required by your application are running at the same time. ************************************************************************ 5. Parallel processing statements and how they work

(¯`•._.•[Jagan’s]•._.•´¯) You create and manage multiple threads using combinations of the 4Test statements parallel, spawn, rendezvous, and critical . In 4Test, all running threads (those not blocked) have the same priority with respect to one another. 4Test executes one instruction for a thread, then passes control to the next thread. The first thread called is the first run, and so on. All threads run to completion unless they are deadlocked. 4Test will detect a script deadlock and raise an exception. Note that the 4Test exit statement terminates all threads immediately when it is executed by one thread. parallel statement A parallel statement spawns a statement for each machine specified and blocks the calling thread until the threads it spawns have all completed. It condenses the actions of spawn and rendezvous and can make code more readable. The parallel statement executes a single statement for each thread. Thus if you wish to run complete tests in parallel threads, use the invocation of a test function (which may execute many statements) with the parallel statement, or use a block of statements with spawn and rendezvous. To use the parallel statement, you have to specify the machines for which threads are to be started. You can follow the parallel keyword with a list of statements, each of which specifies a different Agent name. For example: parallel DoSomething ("Client1") DoSomething ("Client2") The DoSomething function then typically issues a SetMachine(sMachine) call to direct its machine operations to the proper Agent. spawn statement A spawn statement begins execution of the specified statement or block of statements in a new thread. Since the purpose of spawn is to initiate concurrent test operations on multiple machines, the structure of a block of spawned code is typically: · A SetMachine command, which directs subsequent machine operations to the specified Agent. ·

A set of machine operations to drive the application.

·

A verification of the results of the machine operations.

You can use spawn to start a single thread for one machine, and then use successive spawn statements to start threads for other machines being tested. SilkTest scans for all

(¯`•._.•[Jagan’s]•._.•´¯) spawn statements preceding a rendezvous statement and starts all the threads at the same time. However, the typical use of spawn is in a loop, as follows: for each sMachine in lsMachine spawn // start thread for each sMachine SetMachine (sMachine) DoSomething () rendezvous The above example could achieve the same result when written as follows: for each sMachine in lsMachine spawn [sMachine]DoSomething () Rendezvous rendezvous statement A rendezvous statement blocks execution of the calling thread until all threads that were spawned by the calling thread have completed. When the last child thread exits, it unblocks the parent thread. The rendezvous statement is unnecessary if it is the last statement at the end of the testcase. If the calling thread has no child threads, rendezvous does nothing. critical statement A critical statement guarantees that no other thread will execute until the specified statement or indented block of code has executed and passed control to the next statement at the level of the critical statement. Only one thread can have critical status at any time. ************************************************************************ 6. CORE DATA TYPES AGENTOPTION data type Agent options control various aspects of agent operations. When you want to get or set the value of an agent option, you use the appropriate constant from the AGENTOPTION data type to identify the option. For example, the option value identified by OPT_KEYBOARD_DELAY specifies the time the agent waits between each keystroke submitted from a script. You can access the values of options by passing the constants defined for this data type to the GetOption method and SetOption method of the AgentClass class. For information about specific options, see Agent options. 4Test defines this enumerated data type as follows:

(¯`•._.•[Jagan’s]•._.•´¯) type AGENTOPTION is enum OPT_BITMAP_MATCH_COUNT OPT_BITMAP_MATCH_INTERVAL OPT_BITMAP_MATCH_TIMEOUT OPT_BITMAP_PIXEL_TOLERANCE OPT_CLASS_MAP OPT_COMPATIBLE_TAGS OPT_COMPRESS_WHITESPACE OPT_CLOSE_CONFIRM_BUTTONS OPT_CLOSE_DIALOG_KEYS OPT_CLOSE_WINDOW_BUTTONS OPT_CLOSE_WINDOW_MENUS OPT_DEBUG OPT_FORCE_MODAL_UPDATES OPT_KEYBOARD_DELAY OPT_KEYBOARD_LAYOUT OPT_MATCH_ITEM_CASE OPT_MENU_INVOKE_POPUP OPT_MENU_PICK_BEFORE_GET OPT_MENU_PICK_WITH_KEYS OPT_MOUSE_DELAY OPT_POWER_BUILDER OPT_RADIO_LIST OPT_REL1_CLASS_LIBRARY OPT_REQUIRE_ACTIVE OPT_TEXT_NEW_LINE OPT_TRANSLATE_TABLE OPT_TRAP_FAULTS OPT_TRAP_FAULTS_FLAGS OPT_TRIM_ITEM_SPACE OPT_VERIFY_ACTIVE OPT_VERIFY_COORD OPT_VERIFY_CTRLTYPE OPT_VERIFY_ENABLED OPT_VERIFY_EXPOSED OPT_VERIFY_RESPONDING OPT_VERIFY_UNIQUE OPT_VISUAL_BASIC OPT_WINDOW_MOVE_TOLERANCE OPT_WINDOW_RETRY OPT_WINDOW_SIZE_TOLERANCE OPT_WINDOW_TIMEOUT AGENTSWITCH data type

(¯`•._.•[Jagan’s]•._.•´¯)

4Test defines this enumerated data type as follows: type AGENTSWITCH is enum [ ] AS_SHOW_ALL_CLASSES [ ] AS_SHOW_ALL_METHODS ANYTYPE data type Description A variable of type ANYTYPE stores data of any type, including user-defined types. Note Be careful when you give a variable type ANYTYPE, because 4Test does not perform compile-time type checking on it. However, type checking does occur at runtime. APPID data type Description An identification code that uniquely identifies a process. 4Test defines this alias data type as follows: type APPID is INTEGER ARRAY data type Description Used to declare an array variable. Syntax 1 ARRAY [dimension] [, dimension ]... OF data-type array-id Syntax 2 data-type array-id [dimension] [, dimension]... Syntax 3 ARRAY [dimension] OF ARRAY [dimension] OF data-type array-id Variable Description dimension An INTEGER expression that specifies the size of the array. The expression is evaluated at runtime. data-type The data type you want the elements in the array to have.

(¯`•._.•[Jagan’s]•._.•´¯) array-id Notes

An identifier that specifies the name of the array.

Often you need to group several pieces of data together. 4Test uses the ARRAY and LIST compound data types to do this. Use the ARRAY data type to group together data values, all of which must have the same type. Specify the type and number of elements when you declare the array. Arrays are made up of elements that are grouped in a hierarchy. Each level of the hierarchy is called a dimension. Each dimension holds a fixed number of either elements or sub-arrays. The leaf nodes of the hierarchy, which are in the last dimension specified, contain elements; the other dimensions hold sub-arrays. Consider the following array specification: ARRAY[2][3][4] OF INTEGER MyArray In this array there are two sub-arrays at level one, three sub-arrays at level two, and 4 elements in each of the level two sub-arrays. Since each of the level-one sub-arrays contains three sub-arrays, and each of these six level-two sub-arrays contains four elements, MyArray contains 24 elements. Array size must be between 1 and 2147483647 (MAXINT). To refer to an element in a one-dimensional array, use the array name and an expression in square brackets that evaluates to the position of the element in the array. To refer to an element in a multi-dimensional array, use the array name followed by two or more expressions in brackets. ·

The last expression refers to the element.

· The preceding expressions refer to the arrays and subarrays containing the element. ·

A reference to an array must account for each of the specified dimensions.

For example, array2[2,10,5] refers to an element in a three-dimensional array. Alternatively, array2[2][10][5] refers to the same element. 4Test treats each dimension of a multi-dimensional array as a subarray of the larger array. You can initialize an array using the LIST constructor ({}). When you use braces in a declaration of an array object, 4Test implicitly casts the generated list as an array. You cannot modify an existing array using braces—you can only initialize a new array. Examples ARRAY[50] OF STRING array1 ARRAY[20][20][20] OF INTEGER array2 testcase array_example () // 39th element in one-dimensional array

(¯`•._.•[Jagan’s]•._.•´¯) array1[39] = "alphabet soup" // 5th element in 10th second-plane sub-array of 2nd // first-plane sub-array of 3-dimensional array array2[2, 10, 5] = 99 // these two statements access the same element array2[2, 4, 2] = 5 Print (array2[2][4][2]) //prints 5 // initialize an array, starting with element 1 // and overwriting any elements previously set array1 = {...} "foo" "bar" // an alternative initialization array1 = {"foo", "bar"} BOOLEAN data type Description A variable of type BOOLEAN stores either TRUE or FALSE. BROWSERLOCATION data type BROWSERLOCATION is the alias data type for the string or window that identifies a browser page. 4Test defines this data type as follows: type BROWSERLOCATION is STRING, WINDOW BROWSERTYPE data type Description SilkTest supports different Web browsers and uses "browser specifiers" so that you can explicitly specify a particular browser in a script. The following table lists the most commonly used browser specifiers. Consult the release notes for information about additional supported browsers. For the full list of browser specifiers see the 4test.inc file in your <SilkTestInstallDirectory> and search for the word "browsertype". Browser specifier AOL_IE explorer4

Browser embedded IE browser for America Online Internet Explorer 4.0

(¯`•._.•[Jagan’s]•._.•´¯) explorer5 explorer5_DOM explorer6 explorer6_DOM explorer4up explorer6 explorer_DOM explorer5s explorer netscape4 netscape7_DOM netscape6_DOM netscape4x netscape

Internet Explorer 5.x for Virtual Object extension Internet Explorer 5.x for DOM extension Internet Explorer 6 VO Internet Explorer 6.x DOM Internet Explorer 4.x and up for VO: explorer4, explorer5, Internet Explorer for the DOM: explorer5_DOM, explorer6_DOM Internet Explorer 5.x and up (both DOM and VO): explorer5, explorer5_DOM, explorer6, explorer6_DOM Internet Explorer: explorer3, explorer4, explorer5, explorer5_DOM, explorer6, explorer6_DOM Netscape Navigator 4 Netscape Navigator 7 DOM Netscape Navigator 6 DOM Netscape Navigator 4 and up: netscape4, netscape6_DOM, netscape7_DOM Netscape: netscape3, netscape4, netscape6_DOM, netscape7_DOM

Notes You can use a browser specifier in a script in two ways: · You can use a browser specifier in a script or include file to indicate that a particular line applies only to particular browsers. · You can pass a browser specifier to the SetBrowserType or SetDefaultBrowserType function to specify a browser that you want your test to run against. (You cannot use the browser specifiers explorer and netscape this way.) You set the browser in the Runtime Options dialog or by calling the SetBrowserType or SetDefaultBrowserType function, each of which takes an argument of type BROWSERTYPE. If you don’ t set a browser type explicitly in a script, SilkTest will use the browser specified in the Runtime Options dialog. If you try to use a browser specifier instead of a GUI specifier to specify a window, SilkTest will generate an error. The primary use of browser specifiers is to address differences in window declarations between different browsers. Each Agent connection maintains its own browser type, allowing different threads to interact with different browsers. Syntax A browser specifier has the following syntax: [[browser-type [, browser-type]...] | [! browser-type]] For example, you can specify one or more browser types separated by commas, such as:

(¯`•._.•[Jagan’s]•._.•´¯)

netscape4, explorer4 You can also specify all but one browser, such as the following, which indicates that what follows applies to all browsers except Internet Explorer 3: ! explorer3 Example 1 In the following code fragment, netscape and explorer browser specifiers are used to indicate that the tag for the BrowserAuthentication window differs in the two browsers. Note that browser specifiers can be used in conjunction with GUI specifiers as well. window DialogBox BrowserAuthentication netscape tag "Username and Password Required" explorer, msw98 tag "Enter Network Password" explorer, mswnt tag "Authentication" explorer, mswdos tag "Basic Authentication" Example 2 The testcase in the next example (GetItemCount) takes an argument of type BROWSERTYPE, allowing you to pass browser specifiers at runtime. (The testcase uses the recovery system and assumes that wMainWindow is set to the GMO Web application's Welcome page, whose identifier is GMO.) This example uses the main function to pass the arguments. For more information on passing data to a testcase, see the chapter on generalizing testcases. main () LIST OF BROWSERTYPE lbtType BROWSERTYPE btType lbtType = {explorer4, netscape4} for each btType in lbtType GetItemCount (btType) testcase GetItemCount (BROWSERTYPE btType) GMO.About.Click () INTEGER iCount iCount = AboutPage.UsedList.GetItemCount () Print (btType) Print ("Item count: {iCount}") // Results: // Testcase GetItemCount (explorer4) - Passed

(¯`•._.•[Jagan’s]•._.•´¯) // Internet Explorer 4.0 // Item count: 9 // Testcase GetItemCount (netscape4) - Passed // Netscape Navigator 4.0 // Item count: 9 Note In the preceding testcase, you don’t have to call SetBrowserType to set the browser type. That’s because if a BROWSERTYPE argument is passed to a testcase, the recovery system automatically calls SetBrowserType with the argument. CALL data type One entry in a CALL_LIST datatype. 4Test defines this enumerated data type as follows: type CALL is record STRING sFunction STRING sModule INTEGER iLine CALL_LIST data type The data type returned by the ExceptCalls function. 4Test defines this alias data type as follows: type CALL_LIST is LIST OF CALL COLOR data type Describes the RGB values of a color, as returned by the GetBackgroundColor method. 4Test defines this enumerated data type as follows: type COLOR is record INTEGER red INTEGER green INTEGER blue CURSOR data type A data type that identifies the kind of cursor represented by an instance of the CursorClass class. 4Test defines this alias data type as follows: type CURSOR is STRING DATACLASS data type Description

(¯`•._.•[Jagan’s]•._.•´¯)

The legal values of the DATACLASS type are the names of all the 4Test classes, including user-defined classes-for example, MainWin, ChildWin, and CursorClass. Identifiers in window class declarations and the return value from the ClassOf function are both of type DATACLASS. DATASETSIZES data type Description Describes the units for a byte-based size value, such as for disk free space or file size. The unit specifier is an optional parameter for the SYS_GetFreeDiskSpace function and SYS_GetDirContents functions. 4Test defines this enumerated data type as follows: type DATASETSIZES is enum DS_BYTES DS_KILOBYTES DS_MEGABYTES DS_GIGABYTES DS_TERABYTES corresponding to bytes, kilobytes, megabytes, gigabytes and terabytes. DATATYPE data type Description The legal values of the DATATYPE type are the names of data types, for example INTEGER and BOOLEAN. The return value from the TypeOf function is of type DATATYPE. DATETIME data type Description A variable of type DATETIME stores a date plus a time calculated to microseconds. The DATETIME data type represents values from 4713 B.C.E. (B.C.) to 19999 C.E. (A.D.). Notes You can use relational operators between two variables of type DATETIME. You can cast a variable of type DATETIME to or from a type DATE or a type TIME by means of explicit type casting. You can implicitly cast a STRING as a DATETIME as described in the table below.

(¯`•._.•[Jagan’s]•._.•´¯) You can generate a DATETIME constant by specifying a date and time as a string and then casting the string as a DATETIME data type. The string must have the following format: YYYY-MM-DD HH:MM:SS.MSMSMS. Rules covering type casting The following tables describes the rules for type casting: Cast DATETIME to DATE DATETIME to TIME DATE to DATETIME TIME to DATETIME STRING to DATETIME

Rules The time information is lost. Use explicit type casting ([DATE]) The date information is lost. Use explicit type casting ([TIME]) The time is set to midnight. Use explicit type casting ([DATETIME]) The date is set to the current date. Use explicit type casting ([DATETIME]) The string must have the ISO format: YYYY-MM-DD HH:MM:SS.MSMSMSYou can truncate the string at any point, as long as the last field is complete. Use implicit type casting (DATETIME)

Example The example below is artificially contrived to show the following: · The creation of a DateTime constant by implicitly casting a string as a DATETIME. · The conversion, by explicit casting, of the DATETIME to a DATE (this drops the time portion of the DATETIME). · The explicit casting of the DATE value to a DATETIME (so that it can be formatted) and the formatting of the DATETIME. · Printing the formatted DATETIME. Note that the time value changes to midnight. Rules govern the various ways in which you can convert dates and times using casting. DATETIME GrandOpening = "2003-01-02 09:00" DATE OpenDate = [DATE] GrandOpening STRING sOpening sOpening = FormatDateTime ([DATETIME] OpenDate, "mmmm, d, yyyy hh:nn AM/PM") // Print: "Grand Opening on January 2, 2003 12:00 AM."

(¯`•._.•[Jagan’s]•._.•´¯) Print ("Grand Opening on {sOpening}.") DATETIMEPART data type Description 4Test defines this enumerated data type as follows: type DATETIMEPART is enum DTP_YEAR DTP_MONTH DTP_DAY DTP_DAYOFYEAR DTP_DAYOFWEEK DTP_HOUR DTP_MINUTE DTP_SECOND DTP_MICROSEC EKSERVICE data type 4Test defines this enumerated data type as follows: type EKSERVICE is enum [ ] EKS_CB [ ] EKS_CHK [ ] EKS_LB [ ] EKS_LV [ ] EKS_PL [ ] EKS_PB [ ] EKS_PGL [ ] EKS_PROP [ ] EKS_RB [ ] EKS_SCL [ ] EKS_TBL [ ] EKS_TF [ ] EKS_TV [ ] EKS_UD [ ] EKS_UWIN [ ] EKS_WIN EXCEPTION data type 4Test defines this enumerated data type as follows: type EXCEPTION is enum

(¯`•._.•[Jagan’s]•._.•´¯) [ ] // 4TEST [] [ ] E_ABORT = -10100 [ ] E_ACCESS = -10200 [ ] E_AGENT = -10300 [ ] E_ARRAY_SIZE = -10400 [ ] E_ASSERT_FAILED = -10500 [ ] E_ASSIGN = -10600 [ ] E_BAD_ARG = -10700 [ ] E_BAD_INDEX = -10800 [ ] E_BUSY = -10900 [ ] E_CLASS_MISMATCH = -11000 [ ] E_CONST = -11100 [ ] E_DATABASE = -11200 [ ] E_DEADLOCK = -11300 [ ] E_DISABLED = -11400 [ ] E_DIVIDE_BY_ZERO = -11500 [ ] E_FILE = -11600 [ ] E_HALT_THREAD = -11700 [ ] E_HANDLE = -11800 [ ] E_INCOMPAT_TYPES = -11900 [ ] E_INTERNAL = -12000 [ ] E_LIST_FULL = -12100 [ ] E_NO_LIST_OPEN = -12200 [ ] E_NO_RETVAL = -12300 [ ] E_NULL = -12400 [ ] E_NUM_ARGS = -12500 [ ] E_OUT_OF_MEMORY = -12600 [ ] E_SEMAPHORE = -12700 [ ] E_STR_OVERFLOW = -12800 [ ] E_SYNTAX = -12900 [ ] E_SYSTEM = -13000 [ ] E_TIMER = -13100 [ ] E_TYPE_MISMATCH = -13200 [ ] E_UNDEFINED = -13300 [ ] E_UNSUPPORTED = -13400 [ ] E_VAR_EXPECTED = -13500 [ ] E_VAR_NOT_SET = -13600 [ ] E_VERIFY = -13700 [ ] E_WINDOW_TAG = -13800 [ ] E_ZERO_STEP = -13900 [ ] E_PARENT_HALTED = -14000 [ ] E_SIBLING_HALTED = -14100

(¯`•._.•[Jagan’s]•._.•´¯) [ ] E_AGENT_GUI_MISMATCH = -14200 [] [ ] // 4TEST AGENT [ ] E_APP_FAULT = -20000 [ ] E_APP_NOT_RESPONDING = -20100 [ ] E_APPID_INVALID = -20200 [ ] E_BITMAP_NOT_STABLE = -20300 [ ] E_BITMAP_REGION_INVALID = -20400 [ ] E_BITMAPS_ALMOST_MATCH = -20500 [ ] E_BITMAPS_DIFFERENT = -20600 [ ] E_BITMAPS_DIFF_COLORTABLE = -20700 [ ] E_BITMAPS_DIFF_DEPTH = -20800 [ ] E_BITMAPS_DIFF_EMPTY = -20900 [ ] E_BITMAPS_DIFF_HEIGHT = -21000 [ ] E_BITMAPS_DIFF_PLANES = -21100 [ ] E_BITMAPS_DIFF_SIZE = -21200 [ ] E_BITMAPS_DIFF_WIDTH = -21300 [ ] E_CANT_CAPTURE_BITMAP = -21400 [ ] E_CANT_CLEAR_SELECTION = -21500 [ ] E_CANT_CLOSE_WINDOW = -21600 [ ] E_CANT_CONVERT_RESOURCE = -21700 [ ] E_CANT_EXIT_APP = -21800 [ ] E_CANT_EXTEND_SELECTION = -21900 [ ] E_CANT_LOAD_DLL = -22000 [ ] E_CANT_MAXIMIZE_WINDOW = -22100 [ ] E_CANT_MINIMIZE_WINDOW = -22200 [ ] E_CANT_MOVE_WINDOW = -22300 [ ] E_CANT_RESTORE_WINDOW = -22400 [ ] E_CANT_SET_ACTIVE = -22500 [ ] E_CANT_SET_FOCUS = -22600 [ ] E_CANT_SIZE_WINDOW = -22700 [ ] E_CANT_START_APP = -22800 [ ] E_CANT_TRANSLATE_KEYS = -22900 [ ] E_CANT_TRANSLATE_TEXT = -23000 [ ] E_COL_COUNT_INVALID = -23100 [ ] E_COL_NUM_INVALID = -23200 [ ] E_COL_START_EXCEEDS_END = -23300 [ ] E_CONNECTION_REFUSED = -23400 [ ] E_CONTROL_NOT_RESPONDING = -23500 [ ] E_COORD_OFF_SCREEN = -23600 [ ] E_COORD_OUTSIDE_WINDOW = -23700 [ ] E_CURSOR_TIMEOUT = -23800 [ ] E_DELAY_INVALID = -23900

(¯`•._.•[Jagan’s]•._.•´¯) [ ] E_FUNCTION_NOT_FOUND = -24000 [ ] E_FUNCTION_NOT_REGISTERED = -24100 [ ] E_GUIFUNC_ID_INVALID = -24200 [ ] E_ITEM_NOT_FOUND = -24300 [ ] E_ITEM_NOT_VISIBLE = -24400 [ ] E_ITEM_INDEX_INVALID = -24500 [ ] E_INVALID_REQUEST = -24600 [ ] E_KEY_COUNT_INVALID = -24700 [ ] E_KEY_NAME_INVALID = -24800 [ ] E_KEY_SYNTAX_ERROR = -24900 [ ] E_LINE_COUNT_INVALID = -25000 [ ] E_LINE_NUM_INVALID = -25100 [ ] E_LINE_START_EXCEEDS_END = -25200 [ ] E_MOUSE_BUTTON_INVALID = -25300 [ ] E_NO_ACTIVE_WINDOW = -25400 [ ] E_NO_DEFAULT_PUSHBUTTON = -25500 [ ] E_NO_FOCUS_WINDOW = -25600 [ ] E_OPTION_CLASSMAP_INVALID = -25700 [ ] E_OPTION_EVTSTR_LENGTH = -25800 [ ] E_OPTION_NAME_INVALID = -25900 [ ] E_OPTION_TOO_MANY_TAGS = -26000 [ ] E_OPTION_TYPE_MISMATCH = -26100 [ ] E_OPTION_VALUE_INVALID = -26200 [ ] E_POS_INVALID = -26300 [ ] E_POS_NOT_REACHABLE = -26400 [ ] E_PROPERTY_INDEX_INVALID = -26500 [ ] E_PROPERTY_IS_NULL = -26600 [ ] E_PROPERTY_NOT_FOUND = -26700 [ ] E_PROPERTY_READ_ONLY = -26800 [ ] E_PROPERTY_TYPE_MISMATCH = -26900 [ ] E_RESOURCE_NOT_FOUND = -27000 [ ] E_SBAR_HAS_NO_THUMB = -27100 [ ] E_TAG_SYNTAX_ERROR = -27200 [ ] E_TRAP_NOT_SET = -27300 [ ] E_WINDOW_INDEX_INVALID = -27400 [ ] E_WINDOW_NOT_ACTIVE = -27500 [ ] E_WINDOW_NOT_ENABLED = -27600 [ ] E_WINDOW_NOT_EXPOSED = -27700 [ ] E_WINDOW_NOT_FOUND = -27800 [ ] E_WINDOW_NOT_UNIQUE = -27900 [ ] E_WINDOW_SIZE_INVALID = -28000 [ ] E_WINDOW_TYPE_MISMATCH = -28100 []

(¯`•._.•[Jagan’s]•._.•´¯) [ ] E_COLUMN_INDEX_INVALID = -28200 [ ] E_COLUMN_NOT_FOUND = -28201 [ ] E_ITEM_CANT_COLLAPSE = -28300 [ ] E_ITEM_CANT_EXPAND = -28400 [ ] E_KEY_STRING_TOO_LONG = -28500 [] [ ] /*** THESE ARE FOR HANDLING OLE2/VB CALLS ***/ [] [ ] E_AXEXT_NOT_RESPONDING = -28600 [ ] E_OBJ_CALL_FAILED = -28700 [ ] E_OBJ_NOT_FOUND = -28800 [ ] E_ARG_TYPE_MISMATCH = -28900 [ ] E_BAD_ARG_COUNT = -29000 [ ] E_ARG_VAL_OUT_OF_RANGE = -29100 [ ] E_APP_NOT_READY = -29200 [ ] E_CANT_SCROLL_INTO_VIEW = -29300 [ ] E_ALREADY_DRAGGING = -29400 [ ] E_NOT_DRAGGING = -29500 [] [ ] E_DLL_EXCEPTION = -29800 [] [ ] E_ROW_INDEX_INVALID = -30000 [ ] E_TBL_HAS_NO_ROW_HDR = -30100 [ ] E_TBL_HAS_NO_COL_HDR = -30200 [ ] E_TBL_SINGLE_CELL_ONLY = -30300 [ ] E_UD_HAS_NO_RANGE = -30400 [ ] E_ROW_NOT_TOP = -30500 [ ] E_COLUMN_NOT_LEFT = -30600 [] [ ] E_VO_COLUMN_INVALID = -50100 [ ] E_VO_COUNT_INVALID = -50200 [ ] E_VO_ITEM_INDEX_INVALID = -50300 [ ] E_VO_ITEM_NOT_FOUND = -50400 [ ] E_VO_LINE_INVALID = -50500 [ ] E_VO_PROPERTY_NOT_FOUND = -50600 [ ] E_VO_REGION_INVALID = -50700 [ ] E_VO_ROW_INVALID = -50800 [ ] E_VO_STATUS_NOT_FOUND = -50900 [ ] E_VO_TYPE_MISMATCH = -51000 FILEINFO data type

(¯`•._.•[Jagan’s]•._.•´¯) Describes a particular file by providing its attributes. 4Test defines this record data type as follows: type FILEINFO is record string sName boolean bIsDir number iSize integer iAttributes datetime dtLastModifyTime datetime dtCreationTime Where: ·

sName is a string specifying the file name

·

bIsDir is a boolean indicating whether the file is a true file or a directory

·

iSize is an number specifying the file’s size

·

iAttributes is an integer specifying the attributes of the file

· dtLastModifyTime is of the datetime data type and specifies the date and time that the file was last modified · dtCreationTime is of the datetime data type and specifies the date and time that the file was created

Attributes The file attributes that you can determine with FILEINFO are: FILE_ATTRIBUTE_ARCHIVE FILE_ATTRIBUTE_OFFLINE FILE_ATTRIBUTE_COMPRESSED FILE_ATTRIBUTE_READONLY FILE_ATTRIBUTE_DIRECTORY FILE_ATTRIBUTE_REPARSE_POINT FILE_ATTRIBUTE_HIDDEN FILE_ATTRIBUTE_SPARSE_FILE FILE_ATTRIBUTE_ENCRYPTED FILE_ATTRIBUTE_SYSTEM FILE_ATTRIBUTE_NORMAL FILE_ATTRIBUTE_TEMPORARY FILE_ATTRIBUTE_NOT_CONTENT_INDEXED Note To determine a file attribute, you must use a binary AND comparison with the file attribute. If the comparison returns that same file attribute, then the attribute exists. FILEINFO_LIST data type A list containing instances of the FILEINFO data type. 4Test defines this alias data type as follows:

(¯`•._.•[Jagan’s]•._.•´¯)

type FILEINFO_LIST is list of FILEINFO FILEMODE data type Describes the file mode for a file. The file mode is a required parameter for the FileOpen function. 4Test defines this enumerated data type as follows: type FILEMODE is enum FM_READ FM_WRITE FM_UPDATE FM_APPEND Each field is defined as follows: FM_READ FM_WRITE FM_UPDATE

FM_APPEND

Opens the file for reading. SilkTest raises the exception E_FILE if the file does not exist. Opens the file for writing. If the file does not exist, it is created. If the file exists, it is truncated to zero (0) bytes. Similar to FM_WRITE, except that it does not truncate the file. By default, it denies write access to other users. The file pointer is positioned at the beginning of the file. Opens the file for appending. If the file does not exist, it is created. If the file exists, the file pointer is positioned at the last line of the file. By default, it does not deny write access to other users.

FILEPOS data type Describes how the FileSetPointer function should set the read/write position in an open file. 4Test defines this enumerated data type as follows: type FILEPOS is enum FP_START FP_END FP_RELATIVE FILESHARE data type Describes the file-sharing behavior of a file. The file-sharing behavior is an optional parameter for the FileOpen function, IniFileOpen function, and ListWrite function. 4Test defines this enumerated data type as follows: type FILESHARE is enum NULL FS_DENY_NONE FS_DENY_WRITE

(¯`•._.•[Jagan’s]•._.•´¯) FS_EXCLUSIVE Each field is defined as follows: NULL (default) Previous file-sharing behavior. For example, if the file was last opened with a fsShare value of FS_DENY_WRITE, then the next file open will have this value as well. FS_DENY_NONE Others have read/write access. FS_DENY_WRITE Others have read access. FS_EXCLUSIVE Others have no access. FILETYPE data type Describes the file type of a file. The file type is an optional parameter for the FileOpen and IniFileOpen functions. It is available only with SilkTest International. 4Test defines this enumerated data type as follows: type FILETYPE is enum FT_ANSI FT_UNICODE FT_UTF8 Each field is defined as follows: FT_ANSI Creates a new file in ANSI format. FT_UNICODE Creates a new file in UNICODE format. FT_UTF8 Creates a new file in UTF-8 format. FONTSTYLE data type FONTSTYLE identifies the style of a font. 4Test defines this set data type as follows: type FONTSTYLE is set FS_BOLD FS_ITALIC FS_STRUCKOUT FS_UNDERLINE FUZZYVERIFY data type FUZZYVERIFY identifies the values that the optional argument to VerifyProperties can have. It is used in fuzzy verification. 4Test defines this data type as follows: type FUZZYVERIFY is BOOLEAN, DATACLASS, LIST OF DATACLASS

(¯`•._.•[Jagan’s]•._.•´¯) GETWINDOWFLAG data type 4Test defines this enumerated data type as follows: type GETWINDOWFLAG is enum [ ] GW_HWNDFIRST = 0 [ ] GW_HWNDLAST = 1 [ ] GW_HWNDNEXT = 2 [ ] GW_HWNDPREV = 3 [ ] GW_OWNER = 4 [ ] GW_CHILD = 5 HANDLE data type Description Certain functions, such as TimerCreate and FileOpen, create and return values of type HANDLE. You can only store or reassign these return values; you cannot directly create values of type HANDLE. A handle is an identification code provided for certain types of object so that you can pass it to a function that needs to know which object to manipulate. For example, hTimer = TimerCreate() // Create a timer TimerStart (hTimer) // Start the timer just created HDATABASE data type The handle that identifies a database. 4Test defines this alias data type as follows: type HDATABASE is HANDLE HDRIVER data type The handle for a driver. A driver handle provides you with a means to identify, and therefore to access, a specific driver. 4Test defines this alias data type as follows: type HDRIVER is HANDLE HEAPSTATS data type 4Test defines this record data type as follows: type HEAPSTATS is record [ ] INTEGER iHeapSize [ ] INTEGER iHeapCommitted [ ] INTEGER iHeapAllocated

(¯`•._.•[Jagan’s]•._.•´¯) [ ] INTEGER iHeapFree [ ] INTEGER iHeapOverhead HFILE data type The handle for an open file. A file handle provides you with a means to identify, and therefore to access, a specific file. The FileOpen function returns an HFILE that you can then pass to such functions as FileReadLine to identify a particular open file that FileReadLine is to read. 4Test defines this alias data type as follows: type HFILE is HANDLE HINIFILE data type The handle for an open .ini file. A file handle provides you with a means to identify, and therefore to access, a specific file. A .ini file is an initialization file. SilkTest stores test attributes and their values in the initialization file called testplan.ini. The IniFileOpen function returns an HINIFILE that you can then pass to such functions as IniFileSetValue to identify the initialization file in which to set a value. 4Test defines this alias data type as follows: type HINIFILE is HANDLE

HMACHINE data type The handle for a machine that is connected to the 4Test Agent. The Connect function returns an HMACHINE when it completes successfully. 4Test defines this alias data type as follows: type HMACHINE is HANDLE When a function requires a machine handle for an input parameter, you can substitute the string form of the machine name instead of the handle form. For example: SetMachineData ("Client3", "StateData", sTestState) HSQL data type 4Test defines this alias data type as follows: type HSQL is HANDLE HTIMER data type

(¯`•._.•[Jagan’s]•._.•´¯) The handle that identifies a 4Test timer. The TimerCreate function returns an HTIMER. 4Test defines this alias data type as follows: type HTIMER is HANDLE INTEGER data type Description A variable of type INTEGER stores integral values. On all platforms, an INTEGER is 32bits. LBSTYLE data type LBSTYLE describes the style of a list box: single, extended, or multiple. 4Test defines this enumerated data type as follows: type LBSTYLE is enum LBS_SINGLE LBS_EXTEND LBS_MULTIPLE LINKTESTERINFO data type Specifies data passed to the Link Tester tool. 4Test defines this record datatype as follows: type LINKTESTERINFO is record STRING sBaseURL STRING sIncludeDomains INTEGER iDepth LISTCOLUMN data type LISTCOLUMN identifies a column in a table and is defined as follows: type LISTCOLUMN is INTEGER, STRING The interpretation of a value of type LISTCOLUMN depends on whether the type is an integer or a string. An integer value specifies the 1-based index of the column. A string value specifies the name of the column. The string can contain wildcard characters. (You can also specify the index of the column as a string, in the form "#n" where n is the numerical index of the column.) LISTITEM data type

(¯`•._.•[Jagan’s]•._.•´¯)

LISTITEM identifies a particular item in a list that is implemented by a control such as a ListBox, ComboBox, or ListView. It is defined as follows: type LISTITEM is INTEGER, STRING The interpretation of a value of type LISTITEM depends on whether the type is an integer or a string. An integer value specifies the 1-based index of the item. A string value specifies the name of the item. The string can contain wildcard characters. (You can also specify the index of the item as a string, in the form "#n" where n is the numerical index of the item.) LOCALECATEGORY data type 4Test defines this enumerated data type as follows: type LOCALECATEGORY is enum [ ] LC_ALL [ ] LC_COLLATE [ ] LC_CTYPE [ ] LC_MONETARY [ ] LC_NUMERIC [ ] LC_TIME

LONG data type Description Use a variable of type LONG to store integers which require four bytes, for example, a return value from a Microsoft Windows Dynamic Link Library (DLL). LVSTYLE data type LVSTYLE describes the style of a listview: single, extended, or multiple. 4Test defines this enumerated data type as follows: type LVSTYLE is enum LVS_SINGLE LVS_EXTEND LVS_MULTIPLE LVVIEW data type

(¯`•._.•[Jagan’s]•._.•´¯) This data type stores information about the multiple ways to view a elaborated list box control: large and small rearrangeable icons, normal text, and a detail, or report, view. 4Test defines this enumerated data type as follows: type LVVIEW is enum LVV_ICON LVV_SMALL_ICON LVV_LIST LVV_DETAILS MEMINFO data type MEMINFO describes the Windows NT performance counters: a process's working set; the largest address in a process's virtual address space; the number of bytes of writeable, committed memory in a process's address space; and the number of bytes of private (unshared) memory in a process's address space. 4Test defines this enumerated data type as follows: type MEMINFO is enum WORKING_SET VIRTUAL_SIZE PRIVATE_READWRITE PRIVATE_BYTES

MULTITAG_ITEM data type 4Test defines this enumerated data type as follows: type MULTITAG_ITEM is enum [ ] TAG_CAPTION [ ] TAG_PRIOR_LABEL [ ] TAG_INDEX [ ] TAG_WINDOW_ID [ ] TAG_LOCATION MULTITAG_LIST data type 4Test defines this alias data type as follows: type MULTITAG_LIST is LIST OF MULTITAG_ITEM NUMBER data type Description

(¯`•._.•[Jagan’s]•._.•´¯) A variable of type NUMBER stores either integers or real numbers. Use a variable of this type only when its value can be either integer or real. Variables of type NUMBER can have a value from 2.0 – 32. If the value is outside the range, the data type returns a value of zero. PINTERFACE data type Certain properties and methods have a pointer to an ActiveX interface as their return type, for example, a pointer to an IDispatch interface. Such a pointer is represented in 4Test as a PINTERFACE type. 4Test defines this alias data type as follows: type PINTERFACE is LONG The interface pointed to cannot be called directly from SilkTest; however, the pointer can be processed further by passing it to a method or property that accepts a pointer. POINT data type Position coordinates typically used to specify a screen or window location. 4Test defines this record data type as follows: type POINT is record INTEGER x INTEGER y RECT data type The information necessary to specify a rectangle relative to a window, the entire screen, or some other coordinate space. 4Test defines this record data type as follows: type RECT is record INTEGER xPos INTEGER yPos INTEGER xSize INTEGER ySize The following table explains the fields. Field xPos yPos xSize ySize

Description The x-coordinate of the top-left corner. INTEGER. The y-coordinate of the top-left corner. INTEGER. The width (in pixels) of the capture region. INTEGER. The height (in pixels) of the capture region.

SBRANGE data type

(¯`•._.•[Jagan’s]•._.•´¯)

Holds the minimum and maximum values to which a ScrollBar or UpDown object can be set. 4Test defines this record data type as follows: type SBRANGE is record INTEGER iMin INTEGER iMax SCLRANGE data type Holds the minimum and maximum values to which a Scale object can be set. 4Test defines this record data type as follows: type SCLRANGE is record NUMBER nMin NUMBER nMax SIZE datatype Description The dimensions of an object, without regard to position. 4Test defines this record data type as follows [+] type SIZE is record [ ] INTEGER iWidth [ ] INTEGER iHeight STRING data type Description A variable of type STRING stores character strings. You define a string by enclosing it in either single (') or double quotation marks ("). For the range of valid values, see Data type ranges. To sort lists of strings and compare strings by ASCII value, add the line AsciiSort=TRUE in the [Runtime] section of the partner.ini file. This setting also affects the comparison of strings, not just sorting of lists of strings. WINATTR data type 4Test defines this record data type as follows: type WINATTR is record [ ] STRING sName [ ] STRING sVerifyMethod [ ] STRING sGetMethod

(¯`•._.•[Jagan’s]•._.•´¯) TIME data type Description A variable of type TIME holds values for a hours, minutes, seconds, and microseconds. WINATTR_LIST 4Test defines this record data type as follows: type WINATTR_LIST is LIST OF WINATTR WINDOW data type Description You can declare a variable of type WINDOW to store a window identifier and then reference the window using the variable name, instead of using the window identifier as specified in the window's declaration. Examples // The window declaration window MainWin Notepad ... // code in the testcase WINDOW w w = Notepad w.File.Open.Pick () WINDOWDEFINEDHOW data type Use WindowDefinedHow as optional parameter for the IsDefined method to see how a particular string definition has been defined: as a method, not as a method but as some other definition, or to find out if the string is defined in the DATACLASS at all. 4Test defines this enumerated data type as follows: type WINDOWDEFINEDHOW is enum DEFINED_ANY DEFINED_METHOD DEFINED_NOT_METHOD Each field is defined as follows: ·

DEFINED_ANY returns true if the string is defined.

·

DEFINED_METHOD returns true if the string is defined as a method.

(¯`•._.•[Jagan’s]•._.•´¯)

· DEFINED_NOT_METHOD returns true if the string is defined but not as a method (for example, it might be defined as a property or member) and false if the string is defined as a method. WININFO data type 4Test defines this record data type as follows: type WININFO is record [ ] WINDOW w [ ] BOOLEAN bEnabled [ ] BOOLEAN bChecked WINPROP data type 4Test defines this record data type as follows: type WINPROP is record WINDOW w INTEGER iLevel LIST OF PROPINFO lPropInfo WINPROPLIST data type 4Test defines this list data type as follows: type WINPROPLIST is LIST OF WINPROP WINPROPTREE data type The data type used to store the names and values of the properties of a window and that window’s child windows. 4Test defines this data structure as follows: type WINPROPTREE is record STRING sWindow LIST OF PROPINFO lPropInfo LIST OF WINPROPTREE lChildren WINSTATE data type The data type returned by the GetState function to report the current state of a MoveableWin object. 4Test defines this enumerated data type as follows: type WINSTATE is enum WS_NORMAL

(¯`•._.•[Jagan’s]•._.•´¯) WS_MAXIMIZED WS_MINIMIZED WNDTAG data type The data type of the WndTag property, which is the window tag of a window. 4Test defines this alias data type as follows: type WNDTAG is STRING ************************************************************************

Related Documents

Core Data Types Of Silktest
October 2019 10
Types Of Data
June 2020 2
Data Types
November 2019 18
Silktest Faq
October 2019 15
Sediment Core Data
November 2019 10