<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Lenni Ojala</title>
    <description>The latest articles on Forem by Lenni Ojala (@lenni).</description>
    <link>https://forem.com/lenni</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F292109%2F5f8bfd05-76c0-4ed2-818d-6be891023fe0.jpg</url>
      <title>Forem: Lenni Ojala</title>
      <link>https://forem.com/lenni</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/lenni"/>
    <language>en</language>
    <item>
      <title>Git ohjeet suomeksi: Muokkaa edellistä committia</title>
      <dc:creator>Lenni Ojala</dc:creator>
      <pubDate>Sat, 21 Nov 2020 16:43:24 +0000</pubDate>
      <link>https://forem.com/levelupkoodarit/git-ohjeet-suomeksi-muokkaa-edellista-committia-32af</link>
      <guid>https://forem.com/levelupkoodarit/git-ohjeet-suomeksi-muokkaa-edellista-committia-32af</guid>
      <description>&lt;p&gt;Joskus git-kommitin tekemisen jälkeen tekisi mieli tehdä muutoksia - korjata commit-viestin kirjoitusvirhe tai tehdä vielä pieni muutos koodiin. &lt;/p&gt;

&lt;p&gt;Tässä artikkelissa kerrotaan ohjeet commit-viestin muokkaamiseen sekä edellisen commitin tiedostojen muuttamiseen. Bonuksena myös ohjeet Vim-editorin käyttämiseen.&lt;/p&gt;

&lt;p&gt;📝 Git-historiaa ei kannattaa muuttaa, jos olet jo puskenut (&lt;em&gt;push&lt;/em&gt;) committeja remote-repositorioon muiden käytettäväksi, sillä muiden ihmisten historian sotkeminen ei ole hyvä tapa.&lt;/p&gt;

&lt;p&gt;Alla on ohjeet commit-viestin muuttamiseen (ohjeet 1 ja 2) sekä edellisen commitin tiedostojen muuttamiseen (ohje 3):&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Edellisen commit-viestin korvaaminen uudella
&lt;/h3&gt;

&lt;p&gt;Kirjoita komentoriville uusi commit-message amend-parametria käyttäen:&lt;br&gt;
&lt;code&gt;git commit --amend -m "uusi commit message"&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Commit-viestin muokkaaminen ja Vim-editorin käyttö
&lt;/h3&gt;

&lt;p&gt;Jos haluat muokata commit-viestiä, jätetään &lt;code&gt;-m&lt;/code&gt; (&lt;em&gt;message&lt;/em&gt;) parametri pois, jolloin viesti avautuu gitin tekstieditoriin (yleensä Vi tai Vim). Tässä ohjeet editorin käyttämiseen:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Anna komento &lt;code&gt;git commit --amend&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Editori avautuu commit messagen muokkaamista varten&lt;/li&gt;
&lt;li&gt;Paina tietokoneen näppäimistöltä &lt;code&gt;i&lt;/code&gt; ja editori siirtyy kirjoitustilaan (&lt;em&gt;insert&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;Muokkaa commit-messagea. Risuaidalla (&lt;em&gt;#&lt;/em&gt;) alkavat rivit eivät kuulu git-committiin. &lt;/li&gt;
&lt;li&gt;Paina näppäimistöltä &lt;code&gt;esc&lt;/code&gt;, jolloin editori siirtyy komentotilaan&lt;/li&gt;
&lt;li&gt;Uusi commit message tallennetaan ja editori suljetaan kirjoittamalla &lt;code&gt;:wq&lt;/code&gt; ja painamalla  näppäimistöltä enter/rivinvaihto (tässä &lt;code&gt;:&lt;/code&gt; aloittaa komennon, &lt;code&gt;w&lt;/code&gt; tarkoittaa &lt;em&gt;write&lt;/em&gt; (eli tiedoston tallennus) ja &lt;code&gt;q&lt;/code&gt; tarkoittaa &lt;em&gt;quit&lt;/em&gt;)

&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Vim-editorin sulkemisesta löytyy läjäpäin meemejä. Tämä naurattaa: "Olen käyttänyt Vimiä nyt noin 2 vuotta, lähinnä siksi, että en tiedä miten se suljetaan."&lt;/p&gt;

&lt;p&gt;&lt;a href="https://twitter.com/iamdevloper/status/435555976687923200" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F9q3iqn72hotsh206wofd.png" alt="Twiitti tililtä @iamdeveloper: " width="585" height="202"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;h3&gt;
  
  
  3. Tiedostojen muuttaminen edelliseen committiin
&lt;/h3&gt;

&lt;p&gt;Edellisen commitin tiedostoja voi muuttaa &lt;code&gt;amend&lt;/code&gt; -parametrin avulla seuraavasti:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Tee tiedostoihin halutut muutokset (lisää uusia tiedostoja tai tee muutoksia tiedostoihin):&lt;/li&gt;
&lt;li&gt;Lisää tiedostot staging-tilaan komennolla &lt;code&gt;git add&lt;/code&gt; ja tiedostonimi&lt;/li&gt;
&lt;li&gt;Tässä välissä kannattaa ajaa komento &lt;code&gt;git status&lt;/code&gt; ja tarkistaa, että halutut tiedostot ovat stagingissa&lt;/li&gt;
&lt;li&gt;Commitoi lisäys edelliseen committiin komennolla &lt;code&gt;git commit --amend&lt;/code&gt; tai &lt;code&gt;git commit --amend -m "haluttu commit message"&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Loppusanat
&lt;/h3&gt;

&lt;p&gt;Jos tämän jutun git-versiohallintaan liittyvä terminologia kuulostaa vieraalta, ohje suomeksi löytyy esimerkiksi &lt;a href="https://oslevelupkoodarit.github.io/materials/versionhallinta-ja-git.html" rel="noopener noreferrer"&gt;LevelUP-koodarien sivuilta&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>finnish</category>
      <category>git</category>
      <category>tutorial</category>
      <category>gitsuomeksi</category>
    </item>
    <item>
      <title>Robot Framework: Pass Boolean variables from command line</title>
      <dc:creator>Lenni Ojala</dc:creator>
      <pubDate>Fri, 18 Sep 2020 07:38:41 +0000</pubDate>
      <link>https://forem.com/lenni/robot-framework-pass-boolean-variables-from-command-line-403e</link>
      <guid>https://forem.com/lenni/robot-framework-pass-boolean-variables-from-command-line-403e</guid>
      <description>&lt;p&gt;I am often googling how to pass Boolean Command Line arguments in the &lt;a href="https://robotframework.org/" rel="noopener noreferrer"&gt;Robot Framework&lt;/a&gt; when starting tests. The answer is: &lt;code&gt;True&lt;/code&gt; and &lt;code&gt;False&lt;/code&gt; work (case is important here as this is Python).&lt;/p&gt;

&lt;p&gt;In some earlier releases, &lt;code&gt;0&lt;/code&gt; and &lt;code&gt;1&lt;/code&gt; were seen as Boolean but that does not apply in the newer Robot Framework versions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example, passing CLI (Command Line Interface) variables
&lt;/h2&gt;

&lt;p&gt;Below is an example that tests that variable &lt;code&gt;MY_BOOLEAN&lt;/code&gt; is Boolean type (so tests pass both with &lt;code&gt;True&lt;/code&gt; and &lt;code&gt;False&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;I wanted to play with the new Python Inline Evaluation (see &lt;a href="http://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html#inline-python-evaluation" rel="noopener noreferrer"&gt;User Guide here&lt;/a&gt;) so the example has another test that uses that (both tests test exactly the same thing, the only difference is the syntax):&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;And to start that test, &lt;code&gt;MY_BOOLEAN&lt;/code&gt; is given using &lt;code&gt;--variable&lt;/code&gt; notation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;robot --variable MY_BOOLEAN:False path/to/tests/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or, in a shorter form using &lt;code&gt;-v&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;robot -v MY_BOOLEAN:True path/to/tests/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Closing words
&lt;/h2&gt;

&lt;p&gt;Next time when I google "robot framework how to pass boolean command line arguments" I hopefully pop into this blog post 🤓. Maybe this post might also help with the concept of passing Robot Framework variables from the command line.&lt;/p&gt;

&lt;p&gt;ps. Passing multiple arguments is done by adding multiple &lt;code&gt;-v&lt;/code&gt; "blocks":&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;robot -v MY_VARIABLE:cat -v SOME_OTHER_VARIABLE:dog path/to/tests/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>robotframework</category>
      <category>testautomation</category>
      <category>beginners</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Robot Framework - Run tasks using GithubActions</title>
      <dc:creator>Lenni Ojala</dc:creator>
      <pubDate>Mon, 24 Aug 2020 14:53:30 +0000</pubDate>
      <link>https://forem.com/lenni/robot-framework-run-tasks-using-githubactions-1oaa</link>
      <guid>https://forem.com/lenni/robot-framework-run-tasks-using-githubactions-1oaa</guid>
      <description>&lt;p&gt;Submission for the &lt;a href="https://dev.to/devteam/announcing-the-github-actions-hackathon-on-dev-3ljn"&gt;DEV: GitHub Actions For Open Source&lt;/a&gt; 🍕🍝🥕&lt;/p&gt;

&lt;h3&gt;
  
  
  My Workflow
&lt;/h3&gt;

&lt;p&gt;Continuous Integration (CI) workflow for running &lt;a href="https://robotframework.org/" rel="noopener noreferrer"&gt;Robot Framework&lt;/a&gt; RPA (Robotic Process Automation) tasks. &lt;/p&gt;

&lt;p&gt;Task (this is not implemented using actions) searches recipe from &lt;a href="https://www.foodie.fi/" rel="noopener noreferrer"&gt;foodie.fi&lt;/a&gt; site and returns the number of search results. GitHub Action workflows handle following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Basic CI (running tests for Pull Requests, commits to the main branch, and manually)&lt;/li&gt;
&lt;li&gt;Recipe Bot: When someone opens an issue to a GitHub project, recipe search is triggered, Bot closes the issue, and posts number of results as a comment. Bot is implemented using existing Action &lt;a href="https://github.com/marketplace/actions/issue-matching-auto-closer" rel="noopener noreferrer"&gt;Issue matching auto-closer&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Submission Category:
&lt;/h3&gt;

&lt;p&gt;Maintainer Must-Have&lt;/p&gt;

&lt;h3&gt;
  
  
  Link to Code
&lt;/h3&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/laojala" rel="noopener noreferrer"&gt;
        laojala
      &lt;/a&gt; / &lt;a href="https://github.com/laojala/rpa_challenge" rel="noopener noreferrer"&gt;
        rpa_challenge
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      GitHub Actions demo for Robot Framework RPA
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Demo: Find number of recipes in foodie.fi website&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Demo project for running Robot Framework tasks in Docker and in GitHub Workflows.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Background&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Demo is inspired by the &lt;a href="https://mimmitkoodaa.ohjelmistoebusiness.fi/blogi/rpa-summer-challenge/" rel="nofollow noopener noreferrer"&gt;Mimmit Koodaa RPA summer challenge 2020&lt;/a&gt;. Project is also a submission to a &lt;a href="https://dev.to/devteam/announcing-the-github-actions-hackathon-on-dev-3ljn" rel="nofollow"&gt;GitHub Actions Hackathon on DEV&lt;/a&gt; as it demonstrates usage of GitHub Actions.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Project demonstrates&lt;/h3&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;How to run Robot Framework Tasks using Docker without need to install Python and Robot Framework to a computer&lt;/li&gt;
&lt;li&gt;How to run Robot Framework Tasks in GitHub Workflow using GithubActions:
&lt;ul&gt;
&lt;li&gt;Automated runs for commits in the main branch and pull requests. Action can be also triggered manually (configuration:  &lt;a href="https://github.com/laojala/rpa_challenge/.github/workflows/trigger_search.yml" rel="noopener noreferrer"&gt;.github/workflows/trigger_search.yml&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Run Tasks when a new issue is opened. Action uses issue title to search a recipe in &lt;a href="https://www.foodie.fi/recipes" rel="nofollow noopener noreferrer"&gt;foodie.fi/recipes&lt;/a&gt; and closes issue by commenting number of search results in a comment. &lt;strong&gt;This is the wacky wildcard&lt;/strong&gt; submission for the  &lt;a href="https://dev.to/devteam/announcing-the-github-actions-hackathon-on-dev-3ljn" rel="nofollow"&gt;DEV.to Hackathon&lt;/a&gt; 🍕🍝🥕.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Run Tasks locally using&lt;/h2&gt;…&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/laojala/rpa_challenge" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h3&gt;
  
  
  Additional Resources / Info
&lt;/h3&gt;

&lt;p&gt;See also my other submission that implements similar CI for a Robot Framework project: &lt;a href="https://dev.to/laojala/robot-framework-ci-demo-274o"&gt;Robot Framework - Configure CI using GitHub Actions&lt;/a&gt;. Both of these projects are intended as an example for someone who is building CI that runs Robot Frameworks tests/tasks.&lt;/p&gt;

</description>
      <category>actionshackathon</category>
      <category>robotframework</category>
      <category>rpa</category>
    </item>
    <item>
      <title>Robot Framework - Setup CI using GitHub Actions</title>
      <dc:creator>Lenni Ojala</dc:creator>
      <pubDate>Sun, 23 Aug 2020 15:20:22 +0000</pubDate>
      <link>https://forem.com/lenni/robot-framework-ci-demo-274o</link>
      <guid>https://forem.com/lenni/robot-framework-ci-demo-274o</guid>
      <description>&lt;p&gt;Submission for the &lt;a href="https://dev.to/devteam/announcing-the-github-actions-hackathon-on-dev-3ljn"&gt;DEV: GitHub Actions For Open Source&lt;/a&gt; 🦕🦖&lt;/p&gt;

&lt;h3&gt;
  
  
  My Workflow
&lt;/h3&gt;

&lt;p&gt;Continuous Integration (CI) workflow for running &lt;a href="https://robotframework.org/" rel="noopener noreferrer"&gt;Robot Framework&lt;/a&gt; tests. Demo has two Workflows that provide these use cases:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Run Robot Framework tests:

&lt;ul&gt;
&lt;li&gt;when new commits are pushed to the main branch&lt;/li&gt;
&lt;li&gt;when new commits are pushed to a Pull request&lt;/li&gt;
&lt;li&gt;run tests with a pre-defined schedule&lt;/li&gt;
&lt;li&gt;Trigger tests manually. Input variables for a test run.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Reporting:

&lt;ul&gt;
&lt;li&gt;Store Robot Framework reports from test runs&lt;/li&gt;
&lt;li&gt;Post summary of results as comment to a commit. Comment is posted only to the main (master) branch. &lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Submission Category
&lt;/h3&gt;

&lt;p&gt;Maintainer Must-Haves&lt;/p&gt;

&lt;h3&gt;
  
  
  Link to Code
&lt;/h3&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/laojala" rel="noopener noreferrer"&gt;
        laojala
      &lt;/a&gt; / &lt;a href="https://github.com/laojala/robot_docker_demo" rel="noopener noreferrer"&gt;
        robot_docker_demo
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Robot Framework - Setup CI using GitHub Actions
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Robot Framework CI Demo&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;This project demonstrates how to setup Continous Integration for Robot Framework tests using &lt;a href="https://docs.github.com/en/actions" rel="noopener noreferrer"&gt;GitHub Actions&lt;/a&gt;.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Use Cases&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Demo covers these use cases:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Run Robot Framework tests
&lt;ul&gt;
&lt;li&gt;when new commits are pushed to the main branch&lt;/li&gt;
&lt;li&gt;when new commits are pushed to a Pull request&lt;/li&gt;
&lt;li&gt;run tests with a pre-defined schedule&lt;/li&gt;
&lt;li&gt;Trigger tests manually. Input variables for a test run.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Reporting:
&lt;ul&gt;
&lt;li&gt;Store Robot Framework reports from test runs&lt;/li&gt;
&lt;li&gt;Post summary of results as a comment to a commit. The comment is posted only to the main (master) branch.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In other words, a separate CI server (such as Jenkins) is not needed to run Robot Framework tests.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Why use Actions for CI?&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;Using GitHub Actions for setup CI is almost better than sourdough bread 🍞🎉 Setup is straightforward and usage is free for public repositories (see &lt;a href="https://github.com/pricing" rel="noopener noreferrer"&gt;pricing&lt;/a&gt; for other types of repositories).&lt;/p&gt;
&lt;p&gt;Setup described here is very…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/laojala/robot_docker_demo" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h3&gt;
  
  
  Additional Resources / Info
&lt;/h3&gt;

&lt;p&gt;The project is intended as a demo about how to integrate Robot Framework tests to the CI.&lt;/p&gt;

&lt;h4&gt;
  
  
  Description of the tests
&lt;/h4&gt;

&lt;p&gt;The project implements a simple "dinosaur test" that takes two inputs and tests if those are dinosaurs. Test is coded using Robot Framework and it's standard Libraries.  Project has also a cron-schedule for running tests for this dinosaur test once a year and running tests for the pull requests and for commits to the main branch.&lt;/p&gt;

&lt;p&gt;Image below displays how the Dinosaur test can be triggered manually in the Actions:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F67zsszq9ris1ku0zkv7g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F67zsszq9ris1ku0zkv7g.png" alt="Screenshot of GitHub workflow_dispatch event trigger when user has clicked button " width="800" height="939"&gt;&lt;/a&gt;
achillobator", "Creature that is not a dinosaur:&lt;br&gt;
pteranodon", and "Tag for tests to run. Use '*' to run all: dinosaur". Button in the bottom has text "Run workflow""/&amp;gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Further resources
&lt;/h4&gt;

&lt;p&gt;I have created another demo project that describes Docker usage with Robot Framework RPA tasks. This project contains GitHub Actions BOT for closing issues. Project describes in detail how to run Robot Framework tests inside a ready-made Docker container:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/laojala/rpa_challenge" rel="noopener noreferrer"&gt;https://github.com/laojala/rpa_challenge&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/laojala/robot-framework-run-tasks-using-githubactions-1oaa"&gt;DEV Blog Post: Robot Framework - Run tasks using GithubActions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>actionshackathon</category>
      <category>robotframework</category>
      <category>devops</category>
      <category>testing</category>
    </item>
    <item>
      <title>Appium &amp; Robot Framework: Record Test Execution</title>
      <dc:creator>Lenni Ojala</dc:creator>
      <pubDate>Fri, 24 Jul 2020 12:18:07 +0000</pubDate>
      <link>https://forem.com/lenni/appium-robot-framework-record-test-execution-55p</link>
      <guid>https://forem.com/lenni/appium-robot-framework-record-test-execution-55p</guid>
      <description>&lt;p&gt;The latest release of the Robot Framework's &lt;a href="https://github.com/serhatbolsu/robotframework-appiumlibrary" rel="noopener noreferrer"&gt;Appium Library&lt;/a&gt; introduces keywords for recording a video of the Appium test execution in iOS and Android phones. &lt;/p&gt;

&lt;h2&gt;
  
  
  Instructions for use:
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;If test is run in iPhone, install ffmpeg in the Mac where Appium is running: &lt;code&gt;brew install ffmpeg&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Simple use case:&lt;/strong&gt; Use &lt;a href="https://serhatbolsu.github.io/robotframework-appiumlibrary/AppiumLibrary.html#Start%20Screen%20Recording" rel="noopener noreferrer"&gt;Appium Library's&lt;/a&gt; keyword &lt;code&gt;Start Screen Recording&lt;/code&gt; in the Test Setup and &lt;code&gt;Stop Screen Recording&lt;/code&gt; in the Test Teardown. Recording is stored in the same place where Robot test case reports are. Video file is not stored permanently to the storage of the phone.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Error-proof use case:&lt;/strong&gt; Some Android phones (for example  Huawei models) are not capable of recording the screen and the test case will fail (in the latest Appium library     1.5.0.4 - this might change in the future). It is a good idea to start and stop recording using a keyword &lt;code&gt;Run Keyword And Ignore Error&lt;/code&gt; (remember also import BuiltIn library for the Robot Framework code). Here's an example of this error-proof case:
&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Storing recording only for failed tests:&lt;/strong&gt; Here's an example code that stores screen recording only when a test case fails:
&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Viewing videos
&lt;/h3&gt;

&lt;p&gt;For Android recordings, file format is &lt;code&gt;.mp4&lt;/code&gt; that is easy to open with many tools. For iOS, file format is &lt;code&gt;.ffmpeg&lt;/code&gt;. To view ffmpeg videos, use &lt;code&gt;ffplay&lt;/code&gt; in the command line (in a computer where ffmpeg is installed):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ffplay appium-screenrecord-10.ffmpeg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Free word
&lt;/h2&gt;

&lt;p&gt;In my opinion, this example showcases nicely how the use of readily available Robot Framework libraries reduces the amount of test automation code (and thus less maintenance and bugs in it!). Capturing video of the screen is now only a few simple lines of code, whereas file handling using native Appium would require more logic.&lt;/p&gt;

</description>
      <category>mobiletesting</category>
      <category>appium</category>
      <category>robotframework</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How many mistakes can you spot in this exercise?</title>
      <dc:creator>Lenni Ojala</dc:creator>
      <pubDate>Mon, 13 Jul 2020 12:56:16 +0000</pubDate>
      <link>https://forem.com/lenni/how-many-mistakes-can-you-spot-in-this-exercise-30i</link>
      <guid>https://forem.com/lenni/how-many-mistakes-can-you-spot-in-this-exercise-30i</guid>
      <description>&lt;p&gt;&lt;strong&gt;Content warning:&lt;/strong&gt; This post contains sexist material that might make your brain melt.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update (June 2020):&lt;/strong&gt; Course provider has promised to change the wording of their exercises! That is great!&lt;/p&gt;




&lt;p&gt;I could not believe my eyes when I saw this programming exercise on a C++ course that is widely offered in Finnish Universities. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How many mistakes can you spot here?&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Write a program that asks the users gender and age. Finally the program prints a sentence based on the following rule:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Male 0-55 years: “You are a man in his prime!”&lt;/li&gt;
&lt;li&gt;Male 56-100 years: “You are a wise man!”&lt;/li&gt;
&lt;li&gt;Female 0-55 years: “You are like a blooming flower!”&lt;/li&gt;
&lt;li&gt;Female 56-100 years: “You look young for your age!”&lt;/li&gt;
&lt;li&gt;Else “Error encountered!”
Age is handled as an integer variable and gender as string variable (m/f). Letter case is ignored.”&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;And if someone does believe this is true, here's a screencap of it:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fokb28ibqouqnehx5f1cn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fokb28ibqouqnehx5f1cn.png" alt="Screencap from exercise. Text is posted below." width="800" height="611"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This might be some wicked way of pointing out sexism in IT industry. In my opinion, simply, not cool!&lt;/p&gt;

</description>
      <category>inclusion</category>
      <category>womenintec</category>
    </item>
    <item>
      <title>Book review: It’s About Damn Time</title>
      <dc:creator>Lenni Ojala</dc:creator>
      <pubDate>Sat, 02 May 2020 06:59:17 +0000</pubDate>
      <link>https://forem.com/lenni/book-review-it-s-about-damn-time-1k38</link>
      <guid>https://forem.com/lenni/book-review-it-s-about-damn-time-1k38</guid>
      <description>&lt;p&gt;&lt;strong&gt;Heuristics:&lt;/strong&gt; If I can concentrate on reading a business book during &lt;em&gt;the great lockdown of 2020&lt;/em&gt;, it must be good! &lt;/p&gt;

&lt;p&gt;And yes, Arlan Hamilton's unexpected journey (&lt;a href="https://www.itsaboutdamntime.com" rel="noopener noreferrer"&gt;It's About Damn Time&lt;/a&gt;, 2020) to venture capitalist, was a catching read. She started with her resourcefulness and practically without any money, and is now investing in high-potential founders who are people of color, women, and/or LGBT.&lt;/p&gt;

&lt;p&gt;Arlan writes that she wrote this book for &lt;strong&gt;mentoring&lt;/strong&gt; others like her - the book is for anyone, who wants more than society has allotted for them. Book is also for allies - for those who want to understand how diversity can be our greatest superpower.&lt;/p&gt;

&lt;p&gt;And yes, I did get mentoring. And what was great - advice given in the book didn't felt patronising (that is something I find difficult in some self-help books). Arlan's story is about being resourceful and honest and building on top of what you already have. She gives insights into many topics, such as how to handle getting no's, stage fright, importer syndrome, substance abuse, taking care of yourself, and what venture capitalists are looking for when they make their investment decisions. &lt;/p&gt;

&lt;p&gt;The book is funny, and also very queer. I felt warm feelings when seeing chapter  "Shane is my homegirl" (Shane is one of the main characters in the iconic TV show The L Word that was aired when I came out from my lesbian closet in the mid-2000s):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Faqzqxjpscm6xsbyj4rfh.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Faqzqxjpscm6xsbyj4rfh.PNG" alt="Screenshot from Instagram story: book reader in hand." width="312" height="675"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;To whom I recommended the book:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;To someone, who is dreaming of going big and longes for an inspirational read&lt;/li&gt;
&lt;li&gt;For those, who know their privilege and are maybe little ashamed of that. Book does not shame or blame but gives insights into how that privilege can be used for good.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To read more reviews, check &lt;a href="https://www.goodreads.com/book/show/49646727-it-s-about-damn-time" rel="noopener noreferrer"&gt;Goodreads&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;(I got my copy of the book by participating in a book launch team.)&lt;/p&gt;

</description>
      <category>startup</category>
      <category>books</category>
      <category>inclusion</category>
      <category>womenintech</category>
    </item>
    <item>
      <title>Full Stack Open - Reflections of the Course</title>
      <dc:creator>Lenni Ojala</dc:creator>
      <pubDate>Sun, 05 Jan 2020 06:48:00 +0000</pubDate>
      <link>https://forem.com/lenni/full-stack-open-reflections-of-the-course-pap</link>
      <guid>https://forem.com/lenni/full-stack-open-reflections-of-the-course-pap</guid>
      <description>&lt;p&gt;&lt;a href="https://fullstackopen.com/en" rel="noopener noreferrer"&gt;Full stack open&lt;/a&gt; is a free online course organized by University of Helsinki and some top-notch Finnish companies. Stack is very up-to-date: single-page-app development using latest React, Redux, Node.js and MongoDB and course contains also GraphQL tutorial. I attended to the 2019's course and completed 7 ETCS credits (this corresponds to 189 hours of work - it is also very close to what I actually used!). &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I enjoyed the most in the course:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;&lt;strong&gt;Course was very practical&lt;/strong&gt;&lt;/em&gt; - it introduced many npm packages, browser extensions and Node scripts, VSCode editor plugins and programming practices that ease the development.&lt;/li&gt;
&lt;li&gt;Sometimes when doing the first exercises of a topic I felt like "oh-no, this coding style hurts my soul", but then in the end, same exercises were revisited and refactored according to the current best practices. So course really &lt;em&gt;&lt;strong&gt;promoted understanding of the stack.&lt;/strong&gt;&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Course included lots of well curated links about the topics, so it was easy to find extra information. Students were also encouraged to make pull request to the material, if they felt that something could be included.&lt;/li&gt;
&lt;li&gt;Exercises covered &lt;em&gt;&lt;strong&gt;unit testing&lt;/strong&gt;&lt;/em&gt; using &lt;a href="https://jestjs.io/" rel="noopener noreferrer"&gt;Jest&lt;/a&gt;/&lt;a href="https://testing-library.com/docs/react-testing-library/intro" rel="noopener noreferrer"&gt;React Testing Library&lt;/a&gt; and &lt;em&gt;&lt;strong&gt;E2E testing&lt;/strong&gt;&lt;/em&gt; using &lt;a href="https://www.cypress.io/" rel="noopener noreferrer"&gt;Cypress&lt;/a&gt;. I am especially happy for the Cypress part! In addition, this is the first time when I really got a grab of a &lt;em&gt;&lt;strong&gt;functional programming&lt;/strong&gt;&lt;/em&gt; (this is definitely something that'll be needed when writing more Cypress tests).&lt;/li&gt;
&lt;li&gt;Discussion in the course Telegram community was &lt;em&gt;&lt;strong&gt;supporting and friendly&lt;/strong&gt;&lt;/em&gt; and course lecturer &lt;a href="https://github.com/mluukkai" rel="noopener noreferrer"&gt;Matti Luukkainen&lt;/a&gt; was very active there. So if you get stuck, there is knowing, that help is available. Tone of the voice in the course material was encouraging and often hilarious (example below):&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3h7tu5egnt9cx9qzpmqq.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3h7tu5egnt9cx9qzpmqq.jpg" alt="A large part of a typical developer's time is spent on debugging and reading existing code. Every now and then we do get to write a line or two of new code, but a large part of our time is spent on trying to figure out why something is broken or how something works. Good practices and tools for debugging are extremely important for this reason." width="755" height="236"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;To whom I would recommended the course:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Someone, who has gained solid programming knowledge but is stuck to tutorials and tiny projects - after this course you will know how to create full stack web applications and host those online. Problem solving skills promoted in this course make it even possible to obtain new stack (such as &lt;a href="https://facebook.github.io/react-native/" rel="noopener noreferrer"&gt;React Native&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Someone, who is already working in the industry and wants to get working knowledge about latest &lt;a href="https://reactjs.org/" rel="noopener noreferrer"&gt;React&lt;/a&gt;/&lt;a href="https://redux.js.org/" rel="noopener noreferrer"&gt;Redux&lt;/a&gt;/&lt;a href="https://nodejs.org/en/" rel="noopener noreferrer"&gt;Node.js&lt;/a&gt; and shape their Javascript (&lt;a href="http://es6-features.org/" rel="noopener noreferrer"&gt;ES6&lt;/a&gt;) skills and the ways of working. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://fullstackopen.com/en/faq/" rel="noopener noreferrer"&gt;There will be new course on 2020&lt;/a&gt; (it starts on 15th of March). Revised course contains new section about TypeScript. In the meanwhile, current course is still &lt;a href="https://fullstackopen.com/en#course-contents" rel="noopener noreferrer"&gt;online&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I would love to hear your experiences of the Full Stack Open! Have you benefit from it professionally? Or are you planning to take it and would like to ask for something?&lt;/p&gt;

</description>
      <category>fullstackopen</category>
      <category>react</category>
      <category>node</category>
      <category>course</category>
    </item>
  </channel>
</rss>
