Showing posts with label technical stuff. Show all posts
Showing posts with label technical stuff. Show all posts

Thursday, February 2, 2023

More On Designing TAF Layers

If you decide not to design some parts of TAF at the very beginning, you are guaranteed to have HUGE problems in the long run. Do not deceive yourself by thinking that the future is far away. Issues that stem from poor design can turn out to be nasty. It will not be just 'a bit expensive' to get rid of them. Failing to design TAF layers properly may render the whole system virtually unusable. I always invest a lot into the initial design, and I have never regretted it. It saved me time, effort and sanity.

Real Life Requirements For A Test Framework

The layers

The majority of test frameworks solve the same problem, so it is only natural that even on different projects you end up using the same architecture. The variable part is limited to:
-- tests (they depend on requirements);
-- support of the project-specific infrastructure (you may need to implement support for AWS when assigned to project A, and it will not be required on project B, because the stack is completely different).

Balancing team effort

Personally, I developed a habit of thinking of TAF architecture in terms of layers:
-- a layer of test;
-- a layer of helpers (mainly boilerplate, moved out of tests to avoid duplication);
-- core layer and configuration (start up and shutdown, envrironmnet, logging, working with API of third-pary systems, etc.)
This approach has a lot of advantages, because it allows to share workload across the team without stepping on each other toes.

Test Framework Is A Software Product

When you intend to write a test framework you need to remember the following:

- test framework is a software product, which means everything that applies to a commercial product, also applies to a test framework;

- test framework is not less important than the software under test, it is actually more important (and sometimes more complicated) than the software under test.

Test frameworks are created to help you check if you still meet the requirements (and to do it with less effort than manual test requires). Because if you do not meet the requirements, you do not achieve the project goals and|or create more problems than you solve. For instance, you spend enormous amount of time on manual defect management and dealing with architectural issues when it is too late and too expensive.

So if you decide to create a test framework, you have to:
-- define the requirements;
-- define priorities for the requirements;
-- define stages of maturity (what is to be implemented first and what next);
-- find out how much resource you have (time, technical knowledge, congitive ability, ability to delegate);
-- build the schedule of implementation (preferably by using a Gantt diagram).

Otherwise, I am sorry to say, your test framework will be nothing but a cost.

-------------------------------

Related posts:
Real Life Requirements For A Test Framework
More On Designing TAF Layers

Saturday, January 21, 2023

TCP/IP vs Real Life

I was busy talking to my imaginary friends and then it came to me how to explain TCP/IP to the non-technical people. It is important because most of my imaginary friends are non-technical. So, here is how you can do it. 

First, forget the OSI, no one needs it anyway. Think of TCP/IP as your clothes. 

Application layer is your coat, your suit, your jumper, your shoes, your hat.

Transport layer is your shirt, your dress, your pants (meaning trousers), your stockings.

Internet is your underclothes, your lingerie, your thermals.

Link is the naked you.

Protocol stacks follow the same logic. For instance, when you have a date you wear your suit and you put your shoes on, right? Then all this gradually comes off. Then the connection happens. Then you put everything on in the reverse order. You don't put your underwear over your jeans, do you? 

See, technology can be easy to understand.

Monday, September 13, 2021

General Purpose Randomizer

I've decided to introduce some noise into the fingerprints collected on me by various unnecessarily curious services and people, so I've written a simple randomizer for selecting a string from a list of strings. The idea was to remove patterns from server selection process when using vpn. Not sure it'll work for obfuscation, but it is a functioning piece of code. Life will prove the rest.

Known to be working with Ubuntu+bash+ExpressVPN

#!/bin/bash
vpnservers=$(expressvpn list all | cut -d" " -f 1 | tr "\n" " ")
list=${vpnservers}

# using just a big value for length
# syntax ${parameter:offset:length}

vpnservers=${list:12:1500}
printf "Available vpn servers:\n${vpnservers}\n"

read -a arrayofservers <<< ${vpnservers}

length=${#arrayofservers[@]}
printf "Actual array length:\n$length \n\n"

randomvalue=$((1 + $RANDOM % ${length-1}))
printf "Your random value:\n$randomvalue \n\n"

printf "Your server id:\n${arrayofservers[randomvalue]} \n"



Wednesday, February 26, 2020

Docker commands vs Docker life cycle - Basic level

Earlier I noticed that there's one problem with Docker support documentation. Unfortunately, while it is possible to find out the very basic scenarios in its Get Started section, you need to dig through the Internet for hours to find information about use cases. Use cases is an answer to the question "What are we trying to do here, anyway?".

So, I started to collect this information for myself and pair it with command sets. Below you can find a use case for setting up a docker image and performing some basic commands on it. I shall extend this collection later, if I'm lucky.

Tuesday, July 23, 2019

Troubleshooting Citrix Client for Linux and Fixing Mike Support

Sometimes you find yourself in one of those situations when nobody seems to have an easy solution, so you have to find one for yourself. For instance, you may need to connect to your VDI, and start your Skype meeting only to find that your microphone is disabled (in Skype, in Control Panel > Device manager).

And the answer is
to add AllowAudioInput=True
to the section [WFClient]
of wfclient.ini file
of your Citrix client configuration

So, here is how to fix it in slightly more detail:

Friday, June 7, 2019

Bash - Bulk file update with find and sed

Doing bulk file update (mind escapes when using complicated patterns):

#!/bin/bash

if [ -z $1 ] || [ -z $2 ]  || [ -z $3 ] || [ -z $4 ]; then
        printf "\nPlease enter:\n
        1. file command-compatible filename pattern
        2. backup suffix for affected files
        3. pattern to replace
        4. replacement\n\n
        For instance, $0 *.txt .xml-backup blue red\n
        This should replace blue with red in all txt files\n\n"
        exit
fi


filename_pattern=$1
backup_suffix=$2
pattern_to_replace=$3
replace_with=$4

find . -type f -name ${filename_pattern} -exec sed -i${backup_suffix} "s|${pattern_to_replace}|$replace_with|g" {} \+

Bash - Cut a fragment of a log by some criteria (like timestamp)

Here is how to cut out a piece of a log between two unique strings (like timestamps):

#!/bin/bash

printf "\nResults are returned *inclusive*\n\n"

if [ -z $1 ] || [ -z $2 ] || [ -z $3 ]; then
        printf "\nPlease enter SUBSTRSTART SUBSTREND and LOGPATH\nFor instance, $0 11:59:17,206 12:02:14,606 test.log\n\n"
        exit
fi

substrstart=$1
substrend=$2
logpath=$3

sed -n "/${substrstart}/,/${substrend}/p" ${logpath} | tee log_excerpt-$(date +%F_%H-%M-%S) | cat

Bash - Getting network data for the port (localhost only)

Getting network data:

#!/bin/bash

printf "\nCurrently for localhost only\n\n"

if [ -z $1 ]; then
    printf "Please enter port and [host]\n\n"
    exit
fi

port=$1
host=localhost

printf '========= lsof -i ============\n\n'

lsof -i :${port}

printf '========= netstat -lnt | grep $port ============\n\n'

netstat -lnt | grep ${port}

printf '========= nc -z $host $port  ============\n\n'

nc -z ${host} ${port}


Bash - kill everything with a matching name

Just a small script for killing matching processes by name:

#!/bin/bash

if [ -z $1 ]
then
    printf "keyword is empty\n\n"
    exit
fi

let k=0
let min=1

# mind the double brakets in do part
for i in $(ps -e | grep "$1"); do ((k++)); done

if [ "${k}" -lt "${min}" ]
then
    printf "no such process to kill\n\n"
    exit
fi


for i in $(ps -e | grep $1 | cut -s -f1 -d\t); do kill -9 ${i}; done

Thursday, June 6, 2019

Password generator with bash

Looks like the best way to handle your passwords strongly depends on which password breaking approach is the most effective at the moment, and apparently those ways are changing as quickly as technology develops. Which is why it's unlikely that there will ever be a perfect way to avoid all the risks, but we can design an optimal one.

It occurred to me that first we need to select between two strategies: storing generated password or memorizing them with mnemonics. I don't think it would be a good idea to store memorizable data cause it's too easy to break the pattern, or to try to remember a generated one. As I already can do mnemonics, so I decided to write my own password generator (I like having my own collection of tools).

Solution is based on LINK. Stuff in use: cat, tr, fold, head, /dev/urandom, echo, printf, for each and parameters testing

Wednesday, May 29, 2019

Configuration - setting up Docker for Ubuntu 19.04

A friend of mine installed fresh Ubuntu 19.04 for which there is no stable docker yet. So we had to do it a slightly more complicated way.  

NOTE: this configuration does not help with running docker over VPN
NOTE: Some of the commands below may require sudo
NOTE: It is assumed that you configure docker for user without sudo, cause using it with sudo does not quite make sense

Monday, May 27, 2019

Sunday, May 19, 2019

Know your round numbers or how to get 2^X with bash

Since I haven't written anything valuable for a long time and still have no ideas how to fix it, here is an example of how bash can actually help you quickly get values of two to the power of something. So, here we go

pg@dana:~$ for i in {1..100}; do calc "2^$i" | xargs echo; done
2
4
8
16
32
64
128
256
512
1024
2048
4096
8192
16384
32768
65536
<...>
1267650600228229401496703205376


Just in case you want to get to the bottom of it, this mini-script uses:
-- my favorite calc application (package name apcalc)
-- cycles (for ... ; do... ; done)
-- ranges ({1..100})
-- redirection with xargs ( | xargs echo)

Enjoy your Linux!

PS: 'Round numbers' in relation to 2^X is actually an inside joke from the times when I couldn't afford to rent my own flat and had to share

Monday, September 3, 2018

Build your own Goldberd machine: Selenium via SoapUI

NOTE: The code examples I refer to in this blog are no longer available, but you can still read the text

Hello, friends. Here is how you can have Selenium run from SoapUi Groovy script step. This solution was created and tested with:
  • SoapUI 5.X
  • Selenium 3.X
In brief, you need to
  • upgrade the libs under $SOAPUI_HOME/lib (! not bin/ext)
  • use a custom java library (goes under $SOAPUI_HOME/bin/ext)
Auxiliary materials.

Code examples can be found here. An example of a project with a Groovy script is inside the project under auxmaterials folder.


Sunday, October 22, 2017

Some Examples of Bash for Use in Test

Time has come to finally write something of technical nature, not just another advice on how others should work to make me happy. So here is a cheatsheet for a tester who spends at least some of her time with nix console. For obvious reasons it wasn't my intention to cover everything, so please take it just as a memory refresher (or a source of ideas it you find it useful).

NB: It is assumed that as long as you understand what man is, you are fine (use it if my explanation is not enough).

Thursday, January 8, 2015

SoapUi, Groovy and the meaning of life

SoapUi is generally known as a tool for testing web services. Opinion divides on whether to call working with it a pleasure or a torture due to certain differences in professional background of those who gives that opinion. Personally, I believe that is it is a really good tool, but, unlike a washing machine, it needs its fantastic manual to be looked though at the very least: http://www.soapui.org/

Like many other IT tools SoapUi comes in two variants: paid and free of charge community edition. And on top of these two there are two ways of using it (which one you chose depends on your level of expertise). They are:
-- using it as any other UI-based tool
-- use it as extendible multi-purpose multi-tool with some UI for backward compatibility with the brains of normal users.
The latter will be discussed as a remedi against professional midlife crisis and the like.

Why meaning of life though? The thing is I see SoapUi and testing of web services as a great opportunity for those people who crave technical tasks, but can not get them either due to a limited skill with Java or because of all the tasty vacancies being filled in already. Practice proves that dissatisfaction with your job does not always result from shortcomings of your profession but from your lack of understanding what would make up for them. In other words, because you failed to identify the root cause of your dissatisfaction. Please note that it is assumed that the root cause is purely professional and not psychological (as psychological issues are out of scope for this post).