<?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>DEV Community: Volodymyr Obrizan</title>
    <description>The latest articles on DEV Community by Volodymyr Obrizan (@obrizan).</description>
    <link>https://dev.to/obrizan</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1137232%2F265e6e98-00bc-47d4-960b-c535af8aa45c.jpg</url>
      <title>DEV Community: Volodymyr Obrizan</title>
      <link>https://dev.to/obrizan</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/obrizan"/>
    <language>en</language>
    <item>
      <title>Testinel: How I Improved the Automated Testing Workflow with pytest, Selenium, and Playwright</title>
      <dc:creator>Volodymyr Obrizan</dc:creator>
      <pubDate>Sat, 18 Jul 2026 17:40:24 +0000</pubDate>
      <link>https://dev.to/obrizan/how-i-improved-the-automated-testing-workflow-with-pytest-selenium-and-playwright-3jf9</link>
      <guid>https://dev.to/obrizan/how-i-improved-the-automated-testing-workflow-with-pytest-selenium-and-playwright-3jf9</guid>
      <description>&lt;p&gt;In this post, I want to share my experience improving the automated testing process for web applications using Python, pytest, Selenium, and Playwright, and explain how I developed &lt;a href="https://testinel.dev" rel="noopener noreferrer"&gt;Testinel&lt;/a&gt; — a test sentinel, a guardian watching over your tests. My motivation for creating this tool was to reduce the time engineers spend fixing failures in automated tests and to lower the barrier to entry for test automation engineers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;One of my favorite &lt;a href="https://xkcd.com/303/" rel="noopener noreferrer"&gt;XKCD comics&lt;/a&gt; is “Programmers’ #1 Excuse for Legitimately Slacking Off” by Randall Munroe:&lt;/p&gt;

&lt;p&gt;Manager:&lt;br&gt;&lt;/p&gt;

&lt;p&gt;— Hey! Get back to work!&lt;br&gt;&lt;/p&gt;

&lt;p&gt;Programmers:&lt;br&gt;&lt;/p&gt;

&lt;p&gt;— The code is compiling!&lt;br&gt;&lt;/p&gt;

&lt;p&gt;— Oh, okay then.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpsi2tgkmotuve0y73g5e.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpsi2tgkmotuve0y73g5e.png" alt="XKCD comic" width="413" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Almost 20 years have passed since it was published, but the comic is still relevant not only to large projects written in compiled languages such as C++, Rust, or Swift, but also to the process of automating web application testing.&lt;/p&gt;

&lt;p&gt;— Get back to work!&lt;br&gt;&lt;/p&gt;

&lt;p&gt;— The tests are running!&lt;br&gt;&lt;/p&gt;

&lt;p&gt;— Oh, okay then.&lt;/p&gt;

&lt;p&gt;What should a test automation engineer do while automated tests are running? When the entire test suite finishes within a few minutes, you can make yourself a cup of coffee or lean back in your chair and take a short break. But what if the tests take tens of minutes or even hours? There are several options:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;do nothing and relax;&lt;/li&gt;
&lt;li&gt;do nothing and stare at the console or the CI server page;&lt;/li&gt;
&lt;li&gt;work on something else: write new tests, communicate with the team, or perform manual testing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you have other options, tell me in the comments what you do when your tests take an entire hour to complete.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two Problems with Monitoring Automated Test Execution
&lt;/h2&gt;

&lt;p&gt;This is where I noticed the first problem in the testing process: &lt;strong&gt;while a long automated test suite is running, the engineer uses their working time inefficiently&lt;/strong&gt;. They either do nothing — the XKCD option — or switch to other tasks, which reduces productivity because they lose context and stop actively monitoring the tests. Task switching itself also has a negative effect.&lt;/p&gt;

&lt;p&gt;What do I mean by monitoring automated test execution? If all tests pass, which happens fairly often, that is good news and the engineer will not have much work to do. They only need to report to the manager and the team that the automated tests did not detect any problems.&lt;/p&gt;

&lt;p&gt;If some tests fail, however, the difficult work of processing the report begins:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;identify which tests failed;&lt;/li&gt;
&lt;li&gt;determine the reason for each failure: a web application defect, invalid test data, an error in the automated test code, or a failure in the testing infrastructure;&lt;/li&gt;
&lt;li&gt;fix errors in the tests or failures in the testing infrastructure and rerun the tests;&lt;/li&gt;
&lt;li&gt;create or reopen a bug tracker ticket for defects in the web application.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Why does the engineer not monitor test execution from the very beginning? Because &lt;strong&gt;the pytest test runner is designed to generate a detailed test report only after all tests have completed&lt;/strong&gt;. See the video below.&lt;/p&gt;

&lt;p&gt;The engineer can see that a test has failed — &lt;code&gt;FAILED&lt;/code&gt; — but pytest provides the reason for the failure, including the exception, message, and location in the code, only after every test has finished running.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/FjGYpK0HXGM"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;This problem is even more noticeable on a CI server because various testing artifacts — logs, screenshots, videos, and so on — also become available only after the automated tests have completed.&lt;/p&gt;

&lt;p&gt;Conclusion No. 1: during automated test execution, the engineer does not have all the information needed to determine the cause of a failure. Without this information, the engineer can neither create a high-quality bug tracker ticket nor properly fix the automated test scripts.&lt;/p&gt;

&lt;p&gt;The second problem that makes engineers work inefficiently is that &lt;strong&gt;diagnostic information about test failures is poorly structured&lt;/strong&gt;. Anyone who works with automated testing knows how painful it can be to investigate the failure of even a single test:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the traceback can be very long;&lt;/li&gt;
&lt;li&gt;the exception message can be very long;&lt;/li&gt;
&lt;li&gt;the place where the exception occurs is not necessarily the place you should inspect, because you usually need to look at the automated test code rather than the library code;&lt;/li&gt;
&lt;li&gt;all of this is presented as one long wall of text.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those who do not work with automated tests can watch the end of the video above or look at the screenshot below. And this is only part of the output, because a typical traceback does not fit on a single monitor screen.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpi4vrndin995agjwcvyf.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpi4vrndin995agjwcvyf.png" alt="pytest stacktrace demo" width="800" height="786"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Conclusion No. 2: engineers spend a significant amount of time reading large amounts of text to understand why a test failed and how to fix it.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Solved These Two Problems
&lt;/h2&gt;

&lt;p&gt;Let me recap the problems I am trying to solve:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;pytest does not generate a detailed report until testing is complete.&lt;/li&gt;
&lt;li&gt;Diagnostic information about test failures is poorly structured.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I solved the problem of delayed reporting by developing the &lt;a href="https://github.com/Testinel/pytest-testinel" rel="noopener noreferrer"&gt;pytest-testinel&lt;/a&gt; plugin. It streams test events and diagnostic information to a cloud server while the tests are running. At the same time, it uploads screenshots, videos, and Playwright traces to cloud storage so that everything becomes available as soon as an individual test finishes, rather than only after the entire test suite has completed.&lt;/p&gt;

&lt;p&gt;There is no need to rewrite, refactor, or annotate your tests in any special way. It is a drop-in plugin, which means you only need to install and configure it:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Sign up, create a project, and obtain a &lt;code&gt;TESTINEL_DSN&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;pip install pytest-testinel&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;export TESTINEL_DSN=https://testinel.dev/ingest/your_secret_dsn/&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That is all!&lt;/p&gt;

&lt;p&gt;This video demonstrates test events being streamed from Bitbucket Pipelines to the cloud server. Notice that test results appear progressively as the tests run on the CI server. You can begin investigating failures immediately instead of waiting for the entire test suite to finish.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/a9lHaROLYR4"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;I solved the problem of poorly structured diagnostic information by presenting it in a clear and organized way:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I extracted the key information from messages and hid unnecessary noise;&lt;/li&gt;
&lt;li&gt;I separated each traceback frame from the others;&lt;/li&gt;
&lt;li&gt;I classified frames as test, page object, Selenium, and so on, and hid the code of library frames because engineers need to inspect them far less often than the test code;&lt;/li&gt;
&lt;li&gt;I added screenshots, videos, and Playwright traces directly to the report, so engineers no longer need to search for them on the CI server or in a reports directory;&lt;/li&gt;
&lt;li&gt;I added a little color to the code to make it easier on the eyes.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzdn36cmt0yoahbos0s2m.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzdn36cmt0yoahbos0s2m.png" alt="Testinel structured traceback" width="800" height="633"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As a result, I got one big beautiful™ test report:&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fd3yxkg1rzfn5vk0cw41q.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fd3yxkg1rzfn5vk0cw41q.png" alt="Testinel test report" width="800" height="511"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As a bonus, I also got a history of automated test runs. All the structured information was already stored in the database, so why not display 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fko7l3ty9tdr5zmnjw8iu.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fko7l3ty9tdr5zmnjw8iu.png" alt="Testinel test runs table" width="800" height="613"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Anyone running tests with Python, pytest, Selenium, and Playwright can use this system for free: &lt;a href="https://testinel.dev/" rel="noopener noreferrer"&gt;testinel.dev&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusions
&lt;/h2&gt;

&lt;p&gt;I have been testing this solution with our test automation team for six months. On many occasions, I noticed that commits fixing errors in the automated tests appeared in Git before the test suite had even finished running.&lt;/p&gt;

&lt;p&gt;This means that the value hypothesis behind real-time event streaming was confirmed not only by positive feedback from engineers, but also in practice.&lt;/p&gt;

&lt;p&gt;Anyone interested in trying it with their own tests can do so for free: &lt;a href="https://testinel.dev/" rel="noopener noreferrer"&gt;testinel.dev&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;“Volodymyr, you are several years too late. Humans do not read these stack traces anymore. An agent does not care what color the code is in the traceback!”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;You’re absolutely right!™ I am late!&lt;/p&gt;

&lt;p&gt;I came up with the idea for this kind of system long before the AI revolution, and I decided to bring it to production to finally close that gestalt.&lt;/p&gt;

&lt;p&gt;Besides, agents do not solve the problems of real-time event streaming or cloud storage for diagnostic information. To make Testinel useful in this new environment, I am planning to develop a skill and a CLI utility that will make all of this diagnostic information available to agents.&lt;/p&gt;

&lt;p&gt;I therefore believe that the tool will remain useful, provided that such an integration is implemented.&lt;/p&gt;

&lt;p&gt;Vova, always close your gestalts.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fr9zlqu38x9e6gy1z95iq.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fr9zlqu38x9e6gy1z95iq.png" alt="Always be closing shot" width="565" height="353"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>selenium</category>
      <category>playwright</category>
      <category>pytest</category>
      <category>python</category>
    </item>
    <item>
      <title>What is Functional Programming?</title>
      <dc:creator>Volodymyr Obrizan</dc:creator>
      <pubDate>Tue, 15 Apr 2025 09:14:35 +0000</pubDate>
      <link>https://dev.to/obrizan/what-is-functional-programming-4i4d</link>
      <guid>https://dev.to/obrizan/what-is-functional-programming-4i4d</guid>
      <description>&lt;p&gt;&lt;strong&gt;Functional programming (FP)&lt;/strong&gt; is a programming paradigm where computations are treated as the evaluation of mathematical functions rather than as a sequence of instructions that change state.&lt;/p&gt;

&lt;p&gt;At the heart of FP are pure functions, immutability of data, and the absence of side effects. This approach helps create code that is clear, predictable, and easy to test.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Features of Functional Programming
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Pure Functions —&amp;nbsp;A function always returns the same result for the same inputs and does not alter any external state.&lt;/li&gt;
&lt;li&gt;Immutability — Instead of modifying existing variables, new values are created.
3.First-Class Functions — Functions are treated as first-class citizens — they can be passed as arguments, returned from other functions, and assigned to variables.&lt;/li&gt;
&lt;li&gt;No Side Effects — Functions do not affect the external environment: no file writing, no global state changes, no console output.&lt;/li&gt;
&lt;li&gt;Recursion Instead of Loops — Recursion is often used instead of iterative constructs like for and while loops.&lt;/li&gt;
&lt;li&gt;Expression-Oriented Programming — Everything is an expression that returns a value, rather than just a sequence of instructions.&lt;/li&gt;
&lt;li&gt;Function Composition — Complex behavior is built by combining simple functions together.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Where Is Functional Programming Used?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Big Data Processing — Due to its suitability for parallel computation, FP is popular in big data tools like Apache Spark (Scala).&lt;/li&gt;
&lt;li&gt;Financial and Scientific Applications — Where precision, predictability, and mathematical rigor are essential.&lt;/li&gt;
&lt;li&gt;Web Services and APIs — Used in languages like JavaScript or Elixir to build scalable reactive systems.&lt;/li&gt;
&lt;li&gt;Software Testing and Verification
FP simplifies unit testing due to the predictability of pure functions.&lt;/li&gt;
&lt;li&gt;Frontend Development — Libraries like React apply many functional programming concepts (e.g., pure components, immutable state).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  For my Ukrainian-speaking followers
&lt;/h2&gt;

&lt;p&gt;For anyone who wants to dive deeper into functional programming, I’ve translated the tutorial “Functional Programming in Python” (&lt;a href="https://first.institute/edu/course/functional/" rel="noopener noreferrer"&gt;Функціональне програмування на Python&lt;/a&gt;) into Ukrainian, made the examples interactive, and added knowledge quizzes. It’s online and free.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Why Bitbucket Pipelines is Slow and How to Optimize</title>
      <dc:creator>Volodymyr Obrizan</dc:creator>
      <pubDate>Tue, 30 Jul 2024 12:26:42 +0000</pubDate>
      <link>https://dev.to/obrizan/why-bitbucket-pipelines-is-slow-and-how-to-optimize-48m1</link>
      <guid>https://dev.to/obrizan/why-bitbucket-pipelines-is-slow-and-how-to-optimize-48m1</guid>
      <description>&lt;p&gt;Bitbucket Pipelines can be slow due to poor CI infrastructure performance and the time-consuming process of installing dependencies for each build. Here's how to address these issues:&lt;/p&gt;

&lt;h2&gt;
  
  
  Performance Issues:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Infrastructure Delays&lt;/strong&gt;: Delays in provisioning and build setup can occur, with performance inconsistencies noted in monitoring projects.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dependency Installation&lt;/strong&gt;: Installing libraries, tools, packages, and third-party dependencies each time consumes significant build time.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Optimization Approach:
&lt;/h2&gt;

&lt;p&gt;Pre-configure Docker Image:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Dockerfile Creation: Move dependency installation commands to a Dockerfile.&lt;/li&gt;
&lt;li&gt;Build and Push Image: Use Docker Buildx to create an image and push it to Docker Hub.&lt;/li&gt;
&lt;li&gt;Update Pipeline: Modify bitbucket-pipelines.yml to use the new Docker image, eliminating repetitive setup steps.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Example Dockerfile:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; python:3.11.7-slim-bullseye&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;apt-get update
&lt;span class="k"&gt;RUN &lt;/span&gt;apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; build-essential postgresql postgresql-client curl
&lt;span class="k"&gt;RUN &lt;/span&gt;curl https://dl.min.io/client/mc/release/linux-amd64/mc &lt;span class="nt"&gt;--create-dirs&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; ~/minio-binaries/mc
&lt;span class="k"&gt;RUN &lt;/span&gt;&lt;span class="nb"&gt;chmod&lt;/span&gt; +x ~/minio-binaries/mc
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; requirements.txt .&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--ignore-installed&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example Updated bitbucket-pipelines.yml:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;dntl/1l2c-backend-for-tests:latest&lt;/span&gt;
&lt;span class="na"&gt;pipelines&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;step&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;script&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;export PATH=$PATH:~/minio-binaries/&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;mc alias set testing-minio http://localhost:9000 root root-pass&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;mc admin user svcacct add --access-key "test_access_key" --secret-key "test_secret_key" testing-minio root&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;mc mb testing-minio/dean-testing&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;PGPASSWORD=root psql -h localhost -p 5432 -U root postgres -c 'create database dean_unit_tests_db;'&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;python -m pytest . --test_application_name=dean --junitxml=./test-reports/dean_out_report.xml&lt;/span&gt;
        &lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;postgres&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;elasticsearch&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;minio&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Results:
&lt;/h2&gt;

&lt;p&gt;Setup Time Reduction: Dependencies are pre-configured, reducing setup time from several minutes to less than 10 seconds.&lt;/p&gt;

&lt;p&gt;Overall Efficiency: Test execution time decreased significantly, saving valuable build minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion:
&lt;/h2&gt;

&lt;p&gt;By pre-configuring a Docker image, you can optimize Bitbucket Pipelines, ensuring faster and more reliable builds. This approach minimizes dependency on CI infrastructure performance and reduces the total build time.&lt;/p&gt;

&lt;p&gt;For more detailed information, visit the full article &lt;a href="https://www.ciperf.com/why-is-bitbucket-pipelines-slow-how-to-optimize-bitbucket-pipelinesyml-by-minimizing-build-steps.html?utm_source=dev.to"&gt;here&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>bitbucket</category>
      <category>ci</category>
      <category>docker</category>
    </item>
    <item>
      <title>Why Programmers Have a Tough Job</title>
      <dc:creator>Volodymyr Obrizan</dc:creator>
      <pubDate>Fri, 12 Jan 2024 08:44:42 +0000</pubDate>
      <link>https://dev.to/obrizan/why-programmers-have-a-tough-job-19kl</link>
      <guid>https://dev.to/obrizan/why-programmers-have-a-tough-job-19kl</guid>
      <description>&lt;p&gt;In one of the projects we're developing, 85% of the code volume is from third-party libraries. That is, these are the libraries that need to be installed in the project so that the other 15% of the code can work with something. There are a total of 93 such libraries.&lt;/p&gt;

&lt;p&gt;Since the software market is very large and attractive (hundreds of billions of dollars), there are many players, and the competition is frankly fierce.&lt;br&gt;
Players try to innovate, create new features for products, make improvements, in order to stand out favorably from their competitors. In most cases, all these improvements are essentially complete nonsensical nonsense.&lt;/p&gt;

&lt;p&gt;If you stop releasing new versions, you can quickly start losing market share. After all, a competitor will continue to vigorously imitate innovation every month, release versions, press releases, create news hooks, and speak at conferences.&lt;/p&gt;

&lt;p&gt;Programmers have to adapt. With the release of each new version, they need to see how it differs from the previous one and update their current project. As a result, a good part of a programmer's time is spent not on solving the task at hand, but on upgrading libraries, tools, services, and fixing all the inconsistencies in integration that arise from this.&lt;/p&gt;

&lt;p&gt;And this gets very tiresome quickly.&lt;/p&gt;

&lt;p&gt;Can you stop and not update libraries? I do not advise it. Over time, old libraries stop being supported by their manufacturers. First, it becomes impossible to compile the product. And then even the compiled ones stop working. The second aspect: the market demands specialists who can work with modern technologies, not with Algol 68 or Delphi (remember how hyped that technology was?).&lt;/p&gt;

&lt;p&gt;Yes, programmers are well paid. But if you consider motivation besides money, employees are also motivated by success: successfully completed projects, and in the short term - successfully closed tasks.&lt;/p&gt;

&lt;p&gt;And there is also a big problem with this: if you need to constantly integrate new libraries with which there is no experience, then both the estimation of labor costs and the reliability of the solutions obtained suffer greatly. A programmer is forced to constantly study the features of new libraries, adapt to them. And the fact that it is impossible to predict the outcome of a task in terms of labor costs and reliability is very demotivating. A modern programmer rarely leaves work happy: "I completed my tasks and I did the job well".&lt;/p&gt;

&lt;p&gt;This is one of the reasons why programmers burn out very quickly. It seems they are paid well, but the job is complete crap.&lt;/p&gt;

</description>
      <category>job</category>
      <category>programming</category>
      <category>burnout</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
