Prior to the creation of C, was there any unit-testing? Did any assemblers include a testing a framework?
Erm. There is no specific relation between C and testing. C as a language doesn't feature any mechanics for (unit) testing. Testing was and is a distinct item in its own right. Like for many other components of development, more generic tools and procedures have been developed and provided. Nowadays often seen as natural parts of a language, as the are presented in an integrated way - hence the common name Integrated Development Environment - but they are only made to look that way, they are still just sold as a package.
Of course, there are languages that naturally ease some aspect of automated testing - usually as side effect due the formal way of specification they employ to reduce undesired effects. The same information can be used seamless for certain parts of verification and test automation. I'm for one a great fan of Ada (*1). It's way of clear defined data and operations thereon allows not only detection of unsafe or faulty constructs during compilation, but as well on demand addition of test.
Another great example is VHDL, as here the definition of a test bench is (almost) mandatory and part of the language. So while a test framework is part of VHDL, it also shows that any framework (beyond simple, formal checking), goes beyond what a language can do and is always application based.
I can find some academic journals on this topic -- most of which I don't have access too, but I don't see any implementations or examples of it.
Because testing always has been and forever will be a domain of application specific tests. While some languages are (or have developed to be) supportive of test scenarios, it's the application environment that defines the how and wherewith. This is the same way true for unit tests as complete runs.
Thus tests are not only language independent, but also technology independent. Testing goes goes back into the age of mechanical punch card operation. I remember porting an application from stand alone (batch) /370 Assembly, operating on punch cards to a disk based environment (as well /370 Assembly - but we finally got red of all the highly opaque manual/scripted batch). These were the early 1980s. One fun part was that this batch application itself has been converted some 10+ years before from mechanical punch card to /360 Assembly.
Among the documentation I found a set of card stacks, various plug sheets a one special page: the test bench for the run. It was a rather complex setup with several plug sheets involved and multiple tabulator runs. Whenever it was set up for production these stacks were feed to the tabulators to produce an output stack. This output stack, and one of the test stacks was then to be fed to a collator plugged (the collator plug schematic was part of the documentation) to compare both stacks. The documentation stated that this had to be done before each and every run were the machines have been used otherwise inbetween.
Long story short: Test benches have always been a thing and there has been automated support even in the dark ages of mechanical computing. The difference is like with all our too in vastly grown resources that allow more support than ever before.
*1 - Yes, Ada and Assembler do get well together in my mind, as both allow almost unlimited freedom in design. One just needs to specify what is intended. In the end they only differ that in Assembly one can talk dirty without coming clean, while in Ada everything has to be spelled out in a calm and polite manner :))